小朋友學十大排序演算法(1) 氣泡排序

2021-09-02 18:58:37 字數 2318 閱讀 4733

將相鄰兩個數比較,將大的調到後頭。如果有n個數,則要進行n-1趟比較。

在第1趟中要進行n-1次兩兩比較,在第j趟比較中要進行n-j次兩兩比較。

上圖中有5個數,要進行5 - 1 = 4趟比較。

第1趟,要進行n - 1 = 4次兩兩比較;

第2趟,要進行5 - 2 = 3次兩兩比較;

第3趟,要進行5 - 3 = 2次兩兩比較;

第4趟,要進行5 - 4 = 1次兩兩比較。

#include // 列印陣列,方便觀察結果

void print_array(int a, int n)

printf("\n");

}// 氣泡排序演算法

void bubble_sort(int a, int n)

// 列印每一輪比較,每次交換後的結果

print_array(a, n);

} printf("********************\n");

}} int main ()

; 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]交換,陣列變為

j = 0, i = 1, if(a[1] > a[2])為真,a[1]與a[2]交換,陣列變為

j = 0, i = 2, if為真,a[2]與a[3]交換,陣列變為

j = 0, i = 3, if為真,a[3]與a[4]交換,陣列變為,

此時最大的5已經挪到最後的位置,接下來5就不用再處理。

j = 1, i = 0, if為真,a[0]與a[1]交換,陣列變為

j = 1, i = 1, if為真,a[1]與a[2]交換,陣列變為

j = 1, i = 2, if為真,a[2]與a[3]交換,陣列變為,

此時4已經挪到倒數第二個位置,接下來4和5就不用再處理。

j = 2, i = 0, if為真,a[0]與a[1]交換,陣列變為

j = 2, i = 1, if為真,a[1]與a[2]交換,陣列變為,

此時3已經挪到倒數第三個位置,接下來3、4和5就不用再處理。

j = 3, i = 0, if為真,a[0]與a[1]交換,陣列變為,

此時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

********************

以為例。

第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)。

若排序的過程中,兩個相同的資料,其先後順序不會發生變化,則稱這種排序方法是穩定的,否則就是不穩定的。

以對進行氣泡排序為例。這個數列裡有兩個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的相對一直都保持不變,所以,氣泡排序是穩定的排序演算法。

後面的課程中,會接觸到不穩定的排序演算法。

十大排序演算法之氣泡排序1

氣泡排序是最簡單的排序演算法,通過比較相鄰的兩個數字,如果前面的比後面的大則交換位置,否則不變。因此外層迴圈需要n 1次,因為每次比較的是兩個數字,到倒數第二個則可以停止比較,這一次迴圈結束。同時外層每迴圈一次則有乙個數排序完成,因此內層迴圈n 1 i,i為外層的迴圈數,如下。def bsort a...

十大排序演算法之氣泡排序

整理下最近學習的演算法,也方便有需要的人檢視 簡單排序 插入排序 選擇排序 氣泡排序 必學 分治排序 快速排序 歸併排序 必學 分配排序 桶排序 基數排序 樹狀排序 堆排序 必學 其他 計數排序 必學 希爾排序 原理 通過比較相鄰的兩個元素的大小實現排序,如果後邊的元素大於前面的元素,那麼就交換元素...

十大排序演算法之氣泡排序

氣泡排序是一種簡單的排序方法。基本的演算法思想就是對要排序的一組資料進行一遍遍的遍歷,每次遍歷都對相鄰的元素進行比較且調整順序,直到這組資料沒有需要調整的地方,排序完成。下面先用文字敘述一下該排序演算法 公升序 1.比較相鄰的元素。如果第乙個比第二個大,就交換他們兩個,從頭一直比到尾,這樣最終,隊尾...