氣泡排序演算法分析及程式示例

2021-08-30 05:51:41 字數 1944 閱讀 6917

[b]例項說明[/b]

用氣泡排序方法對陣列進行排序。

[b]例項解析[/b]

交換排序的基本思想是兩兩比較待排序記錄的關鍵字,發現兩個記錄的次序相反時即進行交換,直到沒有反序的記錄為止。

應用交換排序基本思想的主要排序方法有氣泡排序和快速排序。

[b]氣泡排序[/b]

將被排序的記錄陣列 r[1..n] 垂直排列,每個記錄 r[i] 看做是重量為 r[i].key 的氣泡。根據輕氣泡不能在重氣泡之下的原則,從下往上掃瞄陣列 r 。凡掃瞄到違反本原則的輕氣泡,就使其向上「漂浮」。如此反覆進行,直到最後任何兩個氣泡都是輕者在上,重者在下為止。

(1) 初始, r[1..n] 為無序區。

(2) 第一趟掃瞄,從無序區底部向上依次比較相鄰的兩個氣泡的重量,若發現輕者在下、重者在上,則交換二者的位置。即依次比較 (r[n],r[n-1]) 、 (r[n-1],r[n-2]) 、 … 、 (r[2],r[1]); 對於每對氣泡 (r[j+1],r[j]), 若 r[j+1].key=i;j--) // 對當前無序區 r[i..n] 自下向上掃瞄

if(r[j+1].key

#define max 255

int r[max];

void bubble_sort(int n)

puts("please input the elements one by one:");

for(i=1;i<=n;i++)

scanf("%d",&r[i]);

puts("the sequence you input is:");

for(i=1;i<=n;i++)

printf("%4d",r[i]);

bubble_sort(n);

puts("\nthe sequence after bubble_sort is:");

for(i=1;i<=n;i++)

printf("%4d",r[i]);

puts("\n press any key to quit…");

getch();

}歸納注釋

演算法的最好時間複雜度: 若檔案的初始狀態是正序的, 一趟掃瞄即可完成排序。所需的關鍵字比較次數 c 和記錄移動次數 m 均達到最小值,即 c(min)=n-1, m(min)= 0 。氣泡排序最好的時間複雜度為 o(n)。

演算法的最壞時間複雜度: 若初始檔案是反序的,需要進行 n-1 趟排序。每趟排序要進行 n-1 次關鍵字的比較 (1<=i<=n-1), 且每次比較都必須移動記錄 3 次。在這種情況下,比較和移動次數均達到最大值,即 c(max)=n(n-1)/2=o(n ^2 ),m(max)=3n(n-1)/2=o(n ^2 )。氣泡排序的最壞時間複雜度為 o(n^2 )。

演算法的平均時間複雜度為 o(n^2 )。雖然氣泡排序不一定要進行 n-1 趟,但由於它的記錄移動次數較多,故平均時間效能比直接插入排序要差得多。

演算法穩定性:氣泡排序是就地排序,且它是穩定的。

演算法改進:上述的氣泡排序還可做如下的改進,① 記住最後一次交換發生位置 lastexchange 的氣泡排序( 該位置之前的相鄰記錄均已有序 )。下一趟排序開始時,r[1..lastexchange-1] 是有序區, r[lastexchange..n] 是無序區。這樣,一趟排序可能使當前有序區擴充多個記錄,從而減少排序的趟數。② 改變掃瞄方向的氣泡排序。氣泡排序具有不對稱性。能一趟掃瞄完成排序的情況,只有最輕的氣泡位於 r[n] 的位置,其餘的氣泡均已排好序,那麼也只需一趟掃瞄就可以完成排序。如對初始關鍵字序列 12、18、42、44、45、67、94、10 就僅需一趟掃瞄。需要 n-1 趟掃瞄完成排序情況,當只有最重的氣泡位於 r[1] 的位置,其餘的氣泡均已排好序時,則仍需做 n-1 趟掃瞄才能完成排序。比如對初始關鍵字序列:94、10、12、18、42、44、45、67 就需 7 趟掃瞄。造成不對稱性的原因是每趟掃瞄僅能使最重氣泡「下沉」乙個位置,因此使位於頂端的最重氣泡下沉到底部時,需做 n-1 趟掃瞄。在排序過程中交替改變掃瞄方向,可改進不對稱性。

選擇排序演算法分析及程式示例

b 例項說明 b 用直接選擇排序方法對陣列進行排序。b 例項解析 b 選擇排序 selection sort 的基本思想是 每趟從待排序的記錄中選出關鍵字最小的記錄,順序放在已排好序的子檔案的最後,直到全部記錄排序完畢。常用的選擇排序方法有直接選擇排序和堆排序。b 直接選擇排序 straight s...

快速排序演算法 vb示例及分析

快速排序對氣泡排序的一種改進。它的基本思想是 通過一趟排序將要排序的資料分割成獨立的兩部分,其中一部分的所有資料都比另外一部分的所有資料都要小,然後再按此方法對這兩部分資料分別進行快速排序,整個排序過程可以遞迴進行,以此達到整個資料變成有序序列。快速排序演算法,對字串陣列進行排序 private s...

排序演算法分析 氣泡排序

假設有n個元素,現在要把這些元素按照從小到大的順序進行排序,那麼演算法步驟如下,從第0個元素開始,比較相鄰的兩個元素,第0個和第1個,第1個和第2個,第n 2個和第n 1個,比較範圍是 0,n 1 所有元素都參與比較 如果左邊的比右邊的大,就交換他們的位置,一直比較到最後乙個元素。這樣經過第一輪交換...