氣泡排序(Bubble Sort)

2021-06-08 19:54:16 字數 2228 閱讀 5028

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

氣泡排序(bubble sort)一種交換排序,它的基本思想是:兩兩比較相鄰記錄的關鍵字,如果反序則交換,直到沒有反序的記錄為止。冒泡的實現在細節上可以很多種變化,我們將分別就3種不同的冒泡實現**,來講解氣泡排序的思想。這裡,我們就先來看看比較容易理解的一段。

對順序表l作交換排序(氣泡排序初級版) 

*/void

bubblesort0(sqlist *l)

}}}

這段**嚴格意義上說,不算是標準的氣泡排序演算法,因為它不滿足「兩兩比較相鄰記錄」的氣泡排序思想,它更應該是最最簡單的交換排序而已。它的思路就是讓每乙個關鍵字,都和它後面的每乙個關鍵字比較,如果大則交換,這樣第一位置的關鍵字在一次迴圈後一定變成最小值。如圖9-3-2,假設我們待排序的關鍵字序列是,當i=1時,9與1交換後,在第一位置的1與後面的關鍵字比較都小,因此它就是最小值。當i=2時,第二位置先後由9換成5,換成3,換成2,完成了第二小的數字交換。後面的數字變換類似,不再介紹。

它應該算是最最容易寫出的排序**了,不過這個簡單易懂的**,卻是有缺陷的。觀察後發現,在排序好1和2的位置後,對其餘關鍵字的排序沒有什麼幫助(數字3反而還被換到了最後一位)。也就是說,這個演算法的效率是非常低的。

我們來看看正宗的冒泡演算法,有沒有什麼改進的地方。

對順序表l作氣泡排序 

*/void

bubblesort(sqlist *l)

}}}

依然假設我們待排序的關鍵字序列是,當i=1時,變數j由8反向迴圈到1,逐個比較,將較小值交換前面,直到最後找到最小值放置在了第1的位置。如圖9-5-3,當i=1,j=8時,我們發現6>2,因此交換了它們的位置,j=7時,4>2,所以交換……直到j=2時,因為1<2,所在不交換。j=1時,9>1,交換,最終得到最小值1放置第一的位置。事實上,在不斷迴圈的過程中,除了將關鍵字1放到第一的位置,我們還將關鍵字2從第九位置提到到了第三的位置,顯然這一演算法比前面的要有進步,在上十萬條資料的排序過程中,這種差異會體現出來。圖中較小的數字如同氣泡般慢慢浮到上面,因此就將此演算法命名為冒泡演算法。

當i=2時,變數j由8反向迴圈到2,逐個比較,在將關鍵字2交換到第二位置的同時,也將關鍵字4和3有所提公升。

後面的數字變換很簡單,這裡就不在贅述了。

9.3.3 氣泡排序優化

這樣的冒泡程式是否還可以優化呢?答案是肯定的。試想一下,如果我們待排序的序列是,也就是說,除了第一和第二的關鍵字需要交換外,別的都已經是正常的順序。當i=1時,交換了2和1,此時序列已經有序,但是演算法仍然不依不饒的將i=2到9,以及每個迴圈中的j迴圈都執行了一遍,儘管並沒有交換資料,但是之後的大量比較還是大大的多餘了。

當i=2時,我們已經對9與8,8與7,……,3與2作了比較,沒有任何資料交換,這就說明此序列已經有序,不需要再繼續後面的迴圈判斷工作了。為了實現這個想法,我們需要改進一下**,增加乙個標記變數flag,來實現這一演算法的改進。

對順序表l作改進冒泡演算法 

*/void

bubblesort2(sqlist *l)

}}}

**改動的關鍵就是在i變數的for迴圈中,增加了對flag是否為true的判斷。經過這樣的改進,氣泡排序在效能上就有了一些提公升,可以避免因已經有序的情況下的無意義迴圈判斷。

9.3.4 氣泡排序複雜度分析

分析一下它的時間複雜度。當最好的情況,也就是要排序的表本身就是有序的,那麼我們比較次數,根據最後改進的**,可以推斷出就是n-1次的比較,沒有資料交換,時間複雜度為o(n)。當最壞的情況,即待排序表是逆序的況,此時需要比較

氣泡排序 bubble sort

氣泡排序是最基本的排序演算法,常被做為內部排序的第乙個排序演算法進行講解。它的原理非常簡單,只是一 個兩層迴圈,每次將最大或最小的放到陣列最後。演算法如下 b為陣列的起始位置,e為陣列的結果位置 int bubble int data,int b,int e return n 這個函式返回兩個整數比...

氣泡排序 Bubble Sort

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

氣泡排序(Bubble sort)

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