冒泡排序

  冒泡排序就是將待排序的元素看做是排列的「氣泡」,較小的元素比較輕,從而要往上浮。在冒牌排序算法中須要對這個「氣泡」序列處理若干遍,所謂的一遍處理,就是自底向上檢查一遍這個序列,並時刻注意兩個相鄰元素的順序是否正確。若是發現兩個相鄰元素逆序,即「輕」的元素在下面,就交換它們的位置。如今處理一遍後,「最輕」的元素就浮到了最高的位置;處理第二遍的時候,「次輕」的元素就浮到了次高的位置。在作做第二遍的時候,因爲最高元素已是「最輕」的元素,因此沒必要檢查。通常地,第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 } 
View Code

案例結果截圖:
    

  

 

  冒牌排序算法效率與穩定性分析

  若是元素初始已排好序,則只須要一輪排序,比較次數n-1,移動次數爲0.

  若是元素處於逆序,則須要進行n-1遍排序,比較次數爲(1+2+3+……+n-1)=n(n-1)/2

  因此冒泡排序的實際愛你複雜度爲O(n2),空間複雜度爲O(1)。因爲冒泡排序是根據輸入序列的順序的大小來決定排序後的位置,故是一種穩定的排序方法。

 

  注:主要參考彭軍、向毅主編的 《數據結構與算法》

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息