氣泡排序演算法(起泡排序)及其C語言實現
阿新 • • 發佈:2018-12-23
起泡排序,別名“氣泡排序”,該演算法的核心思想是將無序表中的所有記錄,通過兩兩比較關鍵字,得出升序序列或者降序序列。
例如,對無序表
圖 1 第一次起泡
如圖 1 所示是對無序表的第一次起泡排序,最終將無序表中的最大值 97 找到並存儲在表的最後一個位置。具體實現過程為:
由於 97 已經判斷為最大值,所以第二次氣泡排序時就需要找出除 97 之外的無序表中的最大值,比較過程和第一次完全相同。
經過第二次冒泡,最終找到了除 97 之外的又一個最大值 76,比較過程完全一樣,這裡不再描述。
執行結果為:
13 27 38 49 49 65 76 97
例如,對無序表
{49,38,65,97,76,13,27,49}
進行升序排序的具體實現過程如圖 1 所示:圖 1 第一次起泡
如圖 1 所示是對無序表的第一次起泡排序,最終將無序表中的最大值 97 找到並存儲在表的最後一個位置。具體實現過程為:
- 首先 49 和 38 比較,由於 38<49,所以兩者交換位置,即從(1)到(2)的轉變;
- 然後繼續下標為 1 的同下標為 2 的進行比較,由於 49<65,所以不移動位置,(3)中 65 同 97 比較得知,兩者也不需要移動位置;
- 直至(4),97 同 76 進行比較,76<97,兩者交換位置,如(5)所示;
- 同樣 97>13(5)、97>27(6)、97>49(7),所以經過一次氣泡排序,最終在無序表中找到一個最大值 97,第一次冒泡結束;
由於 97 已經判斷為最大值,所以第二次氣泡排序時就需要找出除 97 之外的無序表中的最大值,比較過程和第一次完全相同。
經過第二次冒泡,最終找到了除 97 之外的又一個最大值 76,比較過程完全一樣,這裡不再描述。
起泡排序的具體實現程式碼為:通過一趟趟的比較,一個個的“最大值”被找到並移動到相應位置,直到檢測到表中資料已經有序,或者比較次數等同於表中含有記錄的個數,排序結束,這就是
起泡排序。
#include <stdio.h> //交換 a 和 b 的位置的函式 void swap(int *a, int *b); int main() { int array[8] = {49,38,65,97,76,13,27,49}; int i, j; int key; //有多少記錄,就需要多少次冒泡,當比較過程,所有記錄都按照升序排列時,排序結束 for (i = 0; i < 8; i++){ key=0;//每次開始冒泡前,初始化 key 值為 0 //每次起泡從下標為 0 開始,到 8-i 結束 for (j = 0; j+1<8-i; j++){ if (array[j] > array[j+1]){ key=1; swap(&array[j], &array[j+1]); } } //如果 key 值為 0,表明表中記錄排序完成 if (key==0) { break; } } for (i = 0; i < 8; i++){ printf("%d ", array[i]); } return 0; } void swap(int *a, int *b){ int temp; temp = *a; *a = *b; *b = temp; }
總結
使用起泡排序演算法,其時間複雜度同實際表中資料的無序程度有關。若表中記錄本身為正序存放,則整個排序過程只需進行 n-1(n 為表中記錄的個數)次比較,且不需要移動記錄;若表中記錄為逆序存放(最壞的情況),則需要 n-1趟排序,進行 n(n-1)/2 次比較和資料的移動。所以該演算法的時間複雜度為O(n2)
。