詳談內部排序之冒泡排序

冒泡排序


交換排序:

​ 兩兩比較待排序記錄的關鍵碼,如果發生逆序(即排列順序與排序後的次序正好相反),則交換之,直到所有記錄都排好序爲止 。

​ 交換排序的主要算法有:

​ (1) 冒泡排序

​ (2) 快速排序


冒泡排序基本思想:

​ 小的浮起,大的沉底

具體做法:

​ 第一趟:第1個與第2個比較,大則交換;第2個與第3個比較,大則交換,… 關鍵字最大的記錄交換到最後一個位置上;

​ 第二趟:對前n-1個記錄進行同樣的操作,關鍵字次大的記錄交換到第n-1個位置上;

​ 依次類推,則完成排序。


冒泡排序的過程:

例:關鍵字序列 T=(25,56,49,78,11,65,41,36)進行升序排序

​ 請寫出冒泡排序的具體實現過程。

初始狀態 第一趟 第二趟 第三趟 第四趟 第五趟 第六趟
25 25 25 25 11 11 11
56 49 49 11 25 25 25
49 56 11 49 41 36 36
78 11 56 41 36 41 41
11 65 41 36 49 49 49
65 41 36 56 56 56 56
41 36 65 65 65 65 65
36 78 78 78 78 78 78

如圖所示: 加粗斜體的數字爲,已經排序完成的數字。

具體步驟:

​ 1) 第一趟中:
①首先比較(25 ,56),是小於關係,位置不變

結果爲25,56,49,78,11,65,41,36

​ ②再次比較 (56,49),是大於關係,交換位置

結果爲:25,49,56,78,11,65,41,36

​ ③比較 (56,78),是小於關係,位置不變

結果爲:25,49,56,78,11,65,41,36

​ ④比較 (78,11),是大於關係,交換位置

結果爲:25,49,56,11,78,65,41,36

​ ⑤比較 (78,65),是大於關係,交換位置

結果爲:25,49,56,11,65,78,41,36

​ ⑥比較 (78,41),是大於關係,交換位置

結果爲:25,49,56,11,65,41,78,36

​ ⑦比較 (78,36),是大於關係,交換位置

結果爲:25,49,56,11,65,41,36,78


到第⑦步之後,就結束了一次循環。

可以看到,每次循環結束後,我們的最後的一個數就是這一組數據中最大的數。

這樣要注意的是,最後一個數,不需要在進行之後的操作,所以在循環結束一次後,將外層的循環減1。

然後進行下一次循環,重複以上步驟,直到排序完成後退出循環,完成排序


冒泡排序主要算法描述

void Bubblesort(ElemType R[],int n) { 
    int flag=1;  //當flag爲0則停止排序
    for  (int i=n; i>1; i--)  {  //i表示趟數,最多n-1趟
        flag=0;  //開始時元素未交換
        for (int j=2; j<=i; j++)  
           if (R[j]<R[j-1]) {    //發生逆序
               temp=R[j];   R[j]=R[j-1];  R[j-1]=temp; 
               flag=1;
           } 
        if(flag==0) return;    
    }
} // Bubblesort


冒泡排序算法分析:

正序:

​ 只需進行一趟排序,在排序過程中進行n-1次關鍵字間的比較,且不移動記錄;時間複雜度爲O(n) 。

逆序:

​ 需要進行n-1趟排序,需要進行n(n-1)/2次比較,並作等數量級的記錄移動。總的時間複雜度爲O(n^2) 。

​ 冒泡排序方法是穩定的,適合於數據較少的情況。


冒泡排序的性能分析:

時間效率:O(n^2)

空間效率: O(1)

算法的穩定性:穩定

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章