內部排序法 氣泡排序法

2021-06-18 22:26:54 字數 3229 閱讀 8880

氣泡排序法又稱為交換排序法,是由觀察水中冒泡的變化啟發而來。氣泡排序是由第乙個元素開始,比較相鄰元素大小,若大小順序有誤,則對調後再進行下乙個元素的比較。如此掃瞄過一次之後就可確保最後乙個元素是位於正確的順序。接著再逐步進行第二次掃瞄,直到完成所有元素的排序關係為止。

例如:陣列:6、4、9、8、3、5  陣列長度len=6

原始值:6、4、9、8、3、5

第一次掃瞄過程:首先比較6和4,6>4 交換順序:4、6、9、8、3、5,接著繼續比較6和9,6<9不用交換順序保持原順序:4、6、

9、8、3、5,然後再比較9和8,9>8交換順序:4、6、

8、9、3、5,然後比較9和3,9>3交換序:4、6、

8、3、

9、5,最後比較9和5,9>5 交換順序:4、6、

8、3、5、

9 因此第一次掃瞄的結果為:4、6、8、3、5

、9 總比較次數len-1=5次

第二次掃瞄過程:第二

次掃瞄仍從頭開始,但因最後乙個元素是整個陣列中值最大的,所以第二次掃瞄只需比較到倒數第二個元素即可。

首先比較4和6,4<6 保持順序不變,為:4、6、8、3、5

、9;然後比較6和8,6<8順序不變,仍為:4、6、8、3、5

、9 然後接著比較8和3,8>3交換順序為:4、6、

3、8、5、

9,最後比較8和5,8>5交換順序為:4、6、3、5

、8、9;

因此第二次掃瞄的結果為:4、6、3、5、

8、9;   總比較次數len-2=4次

第三次掃瞄過程:第三次掃瞄仍從頭開始,但因最後兩個元素是已排好序,所以第三次掃瞄只需比較到倒數第三個元素即可。

首先比較

4和6,4<6 保持順序不變,為:4、6、

3、5、

8、9;然後比較6和3,6>3交換順序:4、

3、6、

5、8、9

接著比較6和5,6>5交換順序:4、

3、5、

6、8、9;最後比較6和8,6<8順序不變:4、

3、5、

6、8、9;

因此第三次掃瞄的結果為:4、

3、5、

6、8、9;總比較次數len-3=3次

第四次掃瞄過程:第四

次掃瞄仍從頭開始,但因最後三個元素是已排好序,所以第四次掃瞄只需比較到倒數第四個元素即可。

首先比較4和3,4>3交換順序:3、4、5、

6、8、9;最後比較4和5,4<5順序不變:3、4、

5、6、

8、9因此第四次掃瞄的結果為:3、4、

5、6、

8、9  總比較次數len-4=2次

第五次掃瞄過程:第五次掃瞄仍從頭開始,但是最後4個元素已排好序,所以第四次掃瞄只需比較到倒數第五個元素即可。

比較3和4,順序不變:3、4、

5、6、

8、9   總比較次數len-5=1次

經過5次掃瞄就把長度為6的陣列完成了所有排序;

從以上整個過程可以發現氣泡排序具有以下性質:

1、最壞情況和平均情況均需比較(n-1)+(n-2)+……+2+1=(n-1)*n/2次;

2、時間複雜度為o(n^2),最好情況只需掃瞄一次,發現沒有交換的動作即表示已經排好序,所以只需比較n-1次,時間複雜度為o(n);

3、由於氣泡排序只需涉及到相鄰兩元素之間的比較與交換,不會影響其他元素的順序,所以是穩定的。

4、只需乙個額外的空間,所以空間複雜度為o(1),空間複雜度最佳。

5、這種排序法適用於資料量小或有部分資料已經排過序的陣列。

傳統氣泡排序法程式實現: /*

[名稱]:傳統氣泡排序法*/

#include

void maopao(int a,int len);

void swap(int &,int &);

int main()

;int len=6;

printf("原陣列資料為:");

for(int i=0;i<6;i++)

printf("%d ",a[i]);

printf("\n");

maopao(a,len);

printf("原陣列排序後為:");

for(int i=0;i<6;i++)

printf("%d ",a[i]);

printf("\n");

getchar();

return 0;

}void maopao(int a,int _len)

printf("第%d次排序後的結果:",6-_len);

for(int i=0;i<6;i++)

printf("%d ",a[i]);

printf("\n");}}

void swap(int &x,int &y)

輸出結果:

傳統氣泡排序有個明顯的缺點,即不管資料是否已排序完成都固定執行n*(n-1)/2次,可以通過在程式中加入乙個判斷語句來判斷何時終止程式。 /*

[名稱]:改良氣泡排序法

*/#include

void bubble(int a,int len);

void swap(int &,int &);

int main()

;int len=6;

printf("原陣列資料為:");

for(int i=0;i<6;i++)

printf("%d ",a[i]);

printf("\n");

bubble(a,len);

printf("原陣列排序後為:");

for(int i=0;i<6;i++)

printf("%d ",a[i]);

printf("\n");

getchar();

return 0;

}void bubble(int a,int _len)

}if(flag==0)

break;

printf("第%d次排序後的結果:",6-_len);

for(int i=0;i<6;i++)

printf("%d ",a[i]);

printf("\n");}}

void swap(int &x,int &y)

輸出結果為:

排序法之氣泡排序法

首先通過排序方式來分析其步驟 通過排序方式,可以知道是用陣列中的元素挨個比較,如果前面的元素的值比它下乙個角標的元素大,則進行位置置換,然後再用第二個角標的元素與下乙個角標的元素進行比較,同樣如果下乙個角標的元素比它小,則進行位置置換,這樣當比較到arr.length 1個元素時已經沒有 和它進行的...

氣泡排序法 選擇排序法

相鄰兩個數進行比較 如果前者比後者大 就把前者和後者互換 比如十個數 經過九次比較 就可以得到乙個最大的數字於排列的最末端 再經過八次比較 可以得到乙個第二大的數 依次類推 即最大的數一次一次冒泡上來。include int main printf n 資料排序 for i 0 i 9 i 列印資料...

氣泡排序 氣泡排序法

冒泡法是一種簡單的排序方法,它的實現非常簡單。首先對n個專案進行掃瞄,比較相領兩個專案的大小,若發現違背大小次序則進行互換,由此可以使n個專案中的最大者換到最後。然後對剩下的未排序好的專案再進行掃瞄,使它們的最大者換到表的最後。以此類推,直到將表全部排序好為止。這種排序方法,每遍掃瞄以後,都縮短了待...