小朋友學十大排序演算法(1):氣泡排序
一、基本原理(由小到大)
將相鄰兩個數比較,將大的調到後頭。如果有n個數,則要進行n-1趟比較。
在第1趟中要進行n-1次兩兩比較,在第j趟比較中要進行n-j次兩兩比較。

1.png
上圖中有5個數,要進行5 - 1 = 4趟比較。
第1趟,要進行n - 1 = 4次兩兩比較;
第2趟,要進行5 - 2 = 3次兩兩比較;
第3趟,要進行5 - 3 = 2次兩兩比較;
第4趟,要進行5 - 4 = 1次兩兩比較。
二、程式碼實現
#include <stdio.h> // 列印陣列,方便觀察結果 void print_array(int a[], int n) { for(int i = 0; i < n; i++) { printf("%d ", a[i]); } printf("\n"); } // 氣泡排序演算法 void bubble_sort(int a[], int n) { // j表示第幾輪比較 for(int j = 0; j < n - 1; j++) { // i表示待比較的第幾個元素 for(int i = 0; i < n - 1 - j; i++) { if(a[i] > a[i+1]) { a[i] ^= a[i+1]; a[i+1] ^= a[i]; a[i] ^= a[i+1]; } // 列印每一輪比較,每次交換後的結果 print_array(a, n); } printf("********************\n"); } } int main () { int a[] = {5, 4, 3, 2, 1}; int count = sizeof(a) / sizeof(int); // 求陣列元素個數 bubble_sort(a, count); return 0; }
分析:
bubble_sort函式中,有兩層迴圈。外層用j來自增,內層用i來自增。
外層的迴圈自增的慢,內層的迴圈自增的快。
內層的迴圈i要都自增完,外層的j才會自加1。
執行過程為:
j = 0, i = 0, if(a[0] > a[1])為真,a[0]與a[1]交換,陣列變為{4,5,3,2,1}
j = 0, i = 1, if(a[1] > a[2])為真,a[1]與a[2]交換,陣列變為{4,3,5,2,1}
j = 0, i = 2, if為真,a[2]與a[3]交換,陣列變為{4, 3, 2, 5, 1}
j = 0, i = 3, if為真,a[3]與a[4]交換,陣列變為{4, 3, 2, 1, 5},
此時最大的5已經挪到最後的位置,接下來5就不用再處理。
j = 1, i = 0, if為真,a[0]與a[1]交換,陣列變為{3, 4, 2, 1, 5}
j = 1, i = 1, if為真,a[1]與a[2]交換,陣列變為{3, 2, 4, 1, 5}
j = 1, i = 2, if為真,a[2]與a[3]交換,陣列變為{3, 2, 1, 4, 5},
此時4已經挪到倒數第二個位置,接下來4和5就不用再處理。
j = 2, i = 0, if為真,a[0]與a[1]交換,陣列變為{2, 3, 1, 4, 5}
j = 2, i = 1, if為真,a[1]與a[2]交換,陣列變為{2, 1, 3, 4, 5},
此時3已經挪到倒數第三個位置,接下來3、4和5就不用再處理。
j = 3, i = 0, if為真,a[0]與a[1]交換,陣列變為{1, 2, 3, 4, 5},
此時2已經挪到倒數第四個位置,接下來2、3、4和5就不用再處理。
剩餘一個數1,也不用交換了。至此排序完畢。
輸出結果:
4 5 3 2 1 4 3 5 2 1 4 3 2 5 1 4 3 2 1 5 ******************** 3 4 2 1 5 3 2 4 1 5 3 2 1 4 5 ******************** 2 3 1 4 5 2 1 3 4 5 ******************** 1 2 3 4 5 ********************
三、時間複雜度
以{5,4,3,2,1}為例。
第1趟,要進行n - 1 = 4次兩兩比較;
第2趟,要進行5 - 2 = 3次兩兩比較;
第3趟,要進行5 - 3 = 2次兩兩比較;
第4趟,要進行5 - 4 = 1次兩兩比較。
總共比較了4 + 3 + 2 + 1 = 10次。
如果是n個數,比較的次數為(n - 1) + (n - 2) + ... + 2 + 1 = n(n - 1) / 2次。所以時間複雜度是O(n2)。
四、穩定性
若排序的過程中,兩個相同的資料,其先後順序不會發生變化,則稱這種排序方法是穩定的,否則就是不穩定的。
以對{5,2,2,1}進行氣泡排序為例。這個數列裡有兩個2,排序過程為:
5,2,2,1
2,5,2,1
2,2,5,1
2,2,1,5
2,2,1,5
2,1,2,5
1,2,2,5
從整個過程可以看出,兩個2的相對一直都保持不變,所以,氣泡排序是穩定的排序演算法。
後面的課程中,會接觸到不穩定的排序演算法。
少兒程式設計QQ群:581357582,少兒英語QQ群:952399366,微信:307591841

公眾號.jpg