經典排序算法學習筆記一——冒泡排序


冒泡排序

數據結構 數組
最差時間復雜度 O(n^2)
最優時間復雜度 O(n)
平均時間復雜度 O(n^2)
最差空間復雜度 總共O(n),需要輔助空間O(1)

 

 

 

 

 

 

 

 

 

https://zh.wikipedia.org/wiki/%E5%86%92%E6%B3%A1%E6%8E%92%E5%BA%8F#-.7Bzh-hant:.E8.99.9B.E6.93.AC.E7.A2.BC.3Bzh-hans:.E4.BC.AA.E4.BB.A3.E7.A0.81.7D-

1、算法思想

  1. 比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。
  2. 對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最后一對。這步做完后,最后的元素會是最大的數。
  3. 針對所有的元素重復以上的步驟,除了最后一個。
  4. 持續每次對越來越少的元素重復上面的步驟,直到沒有任何一對數字需要比較。

2、偽代碼

function bubble_sort (array, length) {
    var i, j;
    for(i from 0 to length-1){
        for(j from 0 to length-1-i){
            if (array[j] > array[j+1])
                swap(array[j], array[j+1])
        }
    }
}

3、實現

#include <stdio.h>
void bubble_sort(int arr[], int len) {
    int i, j, temp;
    for (i = 0; i < len - 1; i++)
        for (j = 0; j < len - 1 - i; j++)
            if (arr[j] > arr[j + 1]) {
                temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
}
int main() {
    int arr[] = { 22, 34, 3, 32, 82, 55, 89, 50, 37, 5, 64, 35, 9, 70 };
    int len = (int) sizeof(arr) / sizeof(*arr);
    bubble_sort(arr, len);
    int i;
    for (i = 0; i < len; i++)
        printf("%d ", arr[i]);
    return 0;
}

4、改進

(1)設置一個標志,如果這一趟發生了交換,則為true,否則為false。明顯如果有一趟沒有發生交換,說明排序已經完成。

偽代碼:參考 http://visualgo.net/sorting

do
  swapped = false
  for i = 1 to indexOfLastUnsortedElement
    if leftElement > rightElement
      swap(leftElement, rightElement)
      swapped = true
while swapped

實現:參考 http://www.cnblogs.com/morewindows/archive/2011/08/06/2129603.html

void BubbleSort2(int a[], int n)
{
       int j, k;
       bool flag;
      
       k = n;
       flag = true;
       while (flag)
       {
              flag = false;
              for (j = 1; j < k; j++)
                     if (a[j - 1] > a[j])
                     {
                            Swap(a[j - 1], a[j]);
                            flag = true;
                     }
              k--;
       }
}

(2)如果有100個數的數組,僅前面10個無序,后面90個都已排好序且都大於前面10個數字,那么在第一趟遍歷后,最后發生交換的位置必定小於10,且這個位置之后的數據必定已經有序了,記錄下這位置,第二次只要從數組頭部遍歷到這個位置就可以了。

參考:白話經典算法系列之一 冒泡排序的三種實現

http://www.cnblogs.com/morewindows/archive/2011/08/06/2129603.html

實現:

void BubbleSort3(int a[], int n)
{
       int j, k;
       int flag;
      
       flag = n;
       while (flag > 0)
       {
              k = flag;
              flag = 0;
              for (j = 1; j < k; j++)
                     if (a[j - 1] > a[j])
                     {
                            Swap(a[j - 1], a[j]);
                            flag = j;
                     }
       }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM