冒泡排序
交換排序:
兩兩比較待排序記錄的關鍵碼,如果發生逆序(即排列順序與排序後的次序正好相反),則交換之,直到所有記錄都排好序爲止 。
交換排序的主要算法有:
(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)
算法的穩定性:穩定