氣泡排序是我們初學c語言的時候最常接觸到的排序方式,也是程式設計難度最低的一種排序演算法。
那麼,氣泡排序的過程是如何進行的呢?
氣泡排序演算法的原理:
1、比較相鄰的元素。如果第乙個比第二個大(小),就交換他們兩個。
2、對每一對相鄰元素做同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大(小)的數。
3、針對所有的元素重複以上的步驟,除了最後乙個。
4、持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。
example 1:
一組陣列的初始資料為:
0 1 1 0 5 6 4 7
那麼氣泡排序法是怎麼運作使得這組資料變為的呢(此次例子降序排列)?
7 6 5 4 1 1 0 0
【圖示】:
綠色區為初始狀態區
藍色區為有序區
白色區域為無序區
藍色箭頭為每次選出的最小值 放入有序區的過程
黃色箭頭表示發生交換次序的座標位置
交換元素次序**:
if
(a[j]
)
交換次序**:
不難發現,每一次排序,都能使得無序區的乙個最小(大)值放入有序區中。如果有兩個最小(大)值,那也沒關係,下一次排序也把它放入無序區就行了。既然遍歷一次陣列只能在無序區選出乙個最小(大)值,那麼要想把全部的元素(n個)都按順序排列好,則需要n次遍歷。按照這個想法,就催生了**1:
**1:
for
(i=0
;i)}
以example 1來看**1,example 1的資料是8個數字,也就是n=8。那麼這兩個for迴圈總共執行了8*7=56次。**是我們手動模擬**執行過程,這個例子僅僅需要7次迴圈就可以完成排序目的,7與64差距還是挺大的,說明這個氣泡排序**我們還可以進行優化:
既然每次排序都會出現乙個「有序區」,那麼有序區里的資料我們就沒必要進行比較了,對有序區的元素進行比較只會白白浪費時間,所以我們可以在排序的過程中跳過對有序區元素比較的環節,就可以減少無謂的比較了。
**2:
for
(i=0
;i)}
還是以example 1為例:
這一次更改後迴圈次數就是7+6+5+4+3+2+1+0=28次。經過這一次修改效能有所提公升。
時間複雜度:
假如陣列裡的元素本就是有序的,那麼只需要遍歷一趟就可以完成排序。這是氣泡排序最好的時間複雜度:o(n)。
假如陣列裡的元素是反序的狀態,在這種情況之下,氣泡排序的比較次數與移動次數均達到最大值,這也是氣泡排序最壞的時間複雜度:o(n^2)。
因此氣泡排序總的平均時間複雜度為o(n^2)。
演算法穩定性:
人生如茶需慢品,歲月如歌要靜聽。
祝大家學有所成,生活愉快。
C語言 氣泡排序
氣泡排序 兩兩比較相鄰記錄的關鍵碼,如果反序則交換,直到沒有反序記錄為止 將整個待排序的記錄序列分成有序區和無序區,初始時有序區為空,無序區包括所有待排序的記錄 對無序區從前向後依次將相鄰記錄的關鍵碼進行比較,若反序則交換,從而使得關鍵碼小的記錄向前移,關鍵碼大的向後移 像水中的氣泡,體積大的先浮起...
氣泡排序 C語言
c語言是比較簡單基礎的排序方式,排序效率並不高,但是很穩定。通過rand隨機生產10個小於20的數來測試排序。氣泡排序 include include include void bubblesortbetter int a,int n 改進 if flag 0 break void bubbleso...
C語言 氣泡排序
直接看 吧 include void bubblesort int r,int len if exchange 如果沒有發生交換,提前終止演算法 return int main bubblesort aa,10 for int i 0 i 10 i printf d aa i printf n re...