冒泡排序就是將待排序的元素看做是排列的「氣泡」,較小的元素比較輕,從而要往上浮。在冒牌排序算法中須要對這個「氣泡」序列處理若干遍,所謂的一遍處理,就是自底向上檢查一遍這個序列,並時刻注意兩個相鄰元素的順序是否正確。若是發現兩個相鄰元素逆序,即「輕」的元素在下面,就交換它們的位置。如今處理一遍後,「最輕」的元素就浮到了最高的位置;處理第二遍的時候,「次輕」的元素就浮到了次高的位置。在作做第二遍的時候,因爲最高元素已是「最輕」的元素,因此沒必要檢查。通常地,第i遍處理時,沒必要檢查第i高位以上的元素,由於通過前面i -1 遍的處理,它們已是正確地排好序。html
冒泡排序相對比較簡單,只介紹第一遍的排序過程,這裏指以 序列 :46 95 90 12 82 17 30 15 共 8 個元素爲例算法
初始狀態 : 46 95 90 12 82 17 30 15 從最後一個元素開始計算,紅色表示當前搜索到的「最輕」元素,綠色表示相鄰順序錯誤須要交換的元素數據結構
比較一次 : 46 95 90 12 82 17 15 30 順序相反,交換位置ide
比較兩次 : 46 95 90 12 82 15 17 30 順序相反,交換位置spa
比較三次 : 46 95 90 12 15 82 17 30 找到一個「更輕」的元素,不交換code
比較四次 : 46 95 90 12 15 82 17 30 更新「最輕」的元素htm
比較五次 : 46 95 12 90 15 82 17 30 順序相反,交換位置blog
比較六次 : 46 12 95 90 15 82 17 30 順序相反,交換位置排序
比較七次 : 12 46 95 90 15 82 17 30 到達最高位置,結束第一遍get
其餘遍的處理過程相似,這裏就不列出來了。
參考代碼:
1 #include <stdio.h> 2 3 #define MAX_NUM 80 4 5 void bubblesort(int* a, int n) 6 { 7 int temp; 8 for (int i = 0; i < n; i++) 9 { 10 printf("第 %d 遍\n",i+1); 11 for(int j = n - 1; j > i; j--) 12 { 13 if(a[j] < a[j - 1]) 14 { 15 temp = a[j]; 16 a[j] = a[j - 1]; 17 a[j - 1] = temp; 18 19 for(int k = 0; k < n;k++) 20 { 21 printf("%d ",a[k]); 22 } 23 printf("\n"); 24 } 25 26 } 27 } 28 29 } 30 31 int main(int argc, char* argv[]) 32 { 33 int a[MAX_NUM]; 34 int n; 35 36 printf("Input total numbers: "); 37 scanf("%d",&n); 38 39 if( n > MAX_NUM ) n = MAX_NUM; 40 41 for(int i = 0; i < n;i++) 42 { 43 scanf("%d",&a[i]); 44 } 45 46 printf("排序步驟:\n"); 47 bubblesort(a,n); 48 49 return 0; 50 }
案例結果截圖:
冒牌排序算法效率與穩定性分析
若是元素初始已排好序,則只須要一輪排序,比較次數n-1,移動次數爲0.
若是元素處於逆序,則須要進行n-1遍排序,比較次數爲(1+2+3+……+n-1)=n(n-1)/2
因此冒泡排序的實際愛你複雜度爲O(n2),空間複雜度爲O(1)。因爲冒泡排序是根據輸入序列的順序的大小來決定排序後的位置,故是一種穩定的排序方法。
注:主要參考彭軍、向毅主編的 《數據結構與算法》