排序算法(3)——冒泡排序

1、冒泡排序的思想

依次比較相鄰的兩個數,將大數放在前面,小數放在後面。
具體的步驟: 首先從數列開頭比較第1個和第2個數,將大數放前,小數放後。然後比較第2個數和第3個數,將大數放前,小數放後,如此繼續完成第一趟,最小數將沉到底部。 重複以上過程直至最終完成排序。

2、冒泡排序的實現

void bubble_sort(int *a, int size)
{
  int i, j, t;
  for(i = 1; i < size; ++i)//n-1次(後n-1個元素排好序,第1個自然就是最小的)
  { 
     for(j = 0; j < size -i; ++j)//每有一個元素排好序,比較次數就少1
     {
      if(a[j] > a[j+1]){
        t = a[j];
        a[j] = a[j+1];
        a[j+1] = t;
     }
    } // end for j
  }// end for i
}

對於上邊的bubble_sort(),我們發現當第一次外層循環完成後,排序就完成了,後面的循環只有比較,而沒有交換。這樣,我們可以設置一個布爾變量,記錄一次外層循環中是否發生交換,如果未發生交換,算法就返回。改進後的代碼如下bubble_sort_enhanced()所示。

void bubble_sort_enhanced(int *a, int size)
{
    int i, j, t;
    unsigned char swapped;
    for(i = 1; i < size; ++i) {
        swapped = 0;
        for(j = 0; j < size - i; ++j) {
            if(a[j] > a[j+1]){
                t = a[j];
                a[j] = a[j+1];
                a[j+1] = t;
                swapped = 1;
            }
        }
        if(!swapped)
            break;
    }
}

3、冒泡排序的性能

1)、時間複雜度
平均時間複雜度接近於最差時間複雜度,是O(n^2)。因爲逆序情況下比較和交換次數均爲(n-1)+(n-2)+…+i+…1,即n*(n-1)/2。
最好的情況下,該算法複雜度是O(n)。因爲按照改進的算法,對於一個已經有序的數組,算法完成第一次外層循環後就會返回。實際上只發生了 N - 1次比較。

2)、穩定性
冒泡排序是穩定的。

和其它層算法的比較:
快速排序和冒泡排序都是基於比較的排序。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章