氣泡排序(C語言入門)

2021-10-24 21:26:03 字數 1591 閱讀 2580

氣泡排序是我們初學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...