白話經典演算法系列之一 氣泡排序的三種實現 【轉】

Franson發表於2016-06-11

 氣泡排序是非常容易理解和實現,,以從小到大排序舉例:

設陣列長度為N。

1.比較相鄰的前後二個資料,如果前面資料大於後面的資料,就將二個資料交換。

2.這樣對陣列的第0個資料到N-1個資料進行一次遍歷後,最大的一個資料就“沉”到陣列第N-1個位置。

3.N=N-1,如果N不為0就重複前面二步,否則排序完成。

 

按照定義很容易寫出程式碼:

//氣泡排序1
void BubbleSort1(int a[], int n)
{
       int i, j;
       for (i = 0; i < n; i++)
              for (j = 1; j < n - i; j++)
                     if (a[j - 1] > a[j])
                            Swap(a[j - 1], a[j]);
}

下面對其進行優化,設定一個標誌,如果這一趟發生了交換,則為true,否則為false。明顯如果有一趟沒有發生交換,說明排序已經完成。

//氣泡排序2
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--;
       }
}

再做進一步的優化。如果有100個數的陣列,僅前面10個無序,後面90個都已排好序且都大於前面10個數字,那麼在第一趟遍歷後,最後發生交換的位置必定小於10,且這個位置之後的資料必定已經有序了,記錄下這位置,第二次只要從陣列頭部遍歷到這個位置就可以了。

//氣泡排序3
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;
            }
    }
}

氣泡排序畢竟是一種效率低下的排序方法,在資料規模很小時,可以採用。資料規模比較大時,最好用其它排序方法。

相關文章