氣泡排序 bubble sort

2021-04-06 22:51:37 字數 1630 閱讀 4510

氣泡排序是最基本的排序演算法,常被做為內部排序的第乙個排序演算法進行講解。它的原理非常簡單,只是一

個兩層迴圈,每次將最大或最小的放到陣列最後。

演算法如下(b為陣列的起始位置, e為陣列的結果位置):

int bubble(int data, int b, int e)

}return n;

}這個函式返回兩個整數比較以及進行交換的次數。如將序列5, 3, 1, 665, 77, 66, 44, 11, 10, 9, 8, 6

進行排序,bubble返回93。

這個演算法的時間複雜度為

o(n^2)。

而時間複雜度由兩部分組成:比較和交換

比較:最好     平均      最差

o(n^2)   o(n^2)    o(n^2)

交換最好     平均      最差

0       o(n^2)    o(n^2)

也就是說bubble在最好的情況不需要進行交換,那還要做複雜度為o(n^2)的比較不是太浪費了嗎?

下面給出乙個bubble sort的改良版本,這個演算法在資料基本有序時的時間複雜度為

o(n)。最差情況

和bubble函式一樣,也是o(n^2)。

這個演算法的主要思想是在兩個整數最後一次交換後,在前乙個整數後面的所有整數都是排序的,因此在

第一層迴圈的i變化時,無需減1,而只需將i置成這個整數所在的位置。從而第一層迴圈的次數就不一定是

n - 1,當待排序陣列已經是有序時,第一層迴圈只迴圈一次。演算法實現如下。

int bubble_new(int data, int b, int e)}}

return n;

}再用序列5, 3, 1, 665, 77, 66, 44, 11, 10, 9, 8, 6試一試,bubble_new返回65,比bubble快了30%。

完整的**如下:

#include

void output_array(int data, int n)

void swap(int *a, int *b)

int bubble(int data, int b, int e)

}return n;

}int bubble_new(int data, int b, int e)}}

return n;

}int main()

;int data2 = ;

output_array(data1, 12);

printf("%d /n", bubble(data1, 0, 11));

output_array(data1, 12);

printf("-----------------------------------/n");

output_array(data2, 12);

printf("%d /n", bubble_new(data2, 0, 11));

output_array(data2, 12);

return 0;

}其它內部排序

插入排序(insertion sort)

選擇排序(selection sort)

希爾排序(shellsort)

快速排序(quicksort)

歸併排序(merge sort)

氣泡排序(Bubble Sort)

無論你學習哪種程式語言,在學到迴圈和陣列時,通常都會介紹一種排序演算法來作為例子,而這個演算法一般就是氣泡排序。並不是它的名稱很好聽,而是說這個演算法的思路最簡單,最容易理解。因此,哪怕大家可能都已經學過氣泡排序了,我們還是從這個演算法開始我們的排序之旅。氣泡排序 bubble sort 一種交換排...

氣泡排序 Bubble Sort

維基百科 氣泡排序 演算法思想 不斷的交換相鄰的兩個反序元素,使最小元素 上浮 或使最大元素 下沉 每一趟 冒泡 都會確定乙個最大的元素或最小的元素,同選擇排序類似,演算法總共只需進行n 1趟。將乙個陣列豎著放,低位址在上面,高位址在下面,所謂 上浮 就是較小的元素不斷向低位址靠近,所謂 下沉 就是...

氣泡排序(Bubble sort)

氣泡排序 bubble sort 比較簡單,這個演算法的名字由來是因為越大的元素會經由交換慢慢 浮 到數列的頂端,就像燒開了水中的氣泡越往上越大。它的原理是臨近的數字兩兩進行比較,按照從小到大或者從大到小的順序進行交換,這樣一趟過去後,最大或最小的數字被交換到了最後一位,然後再從頭開始進行兩兩比較交...