八大排序算法——冒泡排序

冒泡排序

冒泡排序,顧名思義,它是將關鍵字按照你想要的序列一個一個“冒”出來,它的基本思想是:兩兩比較相鄰記錄的關鍵字,如果反序則交換,直到沒有反序的記錄爲止。
假設我們待排序的數組是a[6]={8,9,1,3,5,7},所要求的序列是升序,那麼如下圖,算法的第一次冒泡是先將最大關鍵字9“冒”到末置位。其過程:先將8和9比較,8<9不交換;再將9和1比較,9>1交換;然後將9和3比較,9>3交換,以此類推,關鍵字9就被交換到了最後一位。從圖中可以分析出,第一次冒泡我們交換了5次,也就是n-1次(n爲數組下標,也就是關鍵字個數),那最後一位已經是最大關鍵字了,第二次冒泡我們就不用再去比較它了,所以第二次冒泡我們只需要比較4次,也就是n-2次。由此可知,第一次冒泡比較的次數爲n-1次,其後每一次冒泡我們所要比較的次數是上一次冒泡比較的次數-1,這是一個循環遞減的過程。
那麼我們到底需要冒泡幾次才能得到想要的序列呢,很明顯,當我們不需要再比較也就是比較次數爲0的時候,就不需要再進行冒泡了,也就是說我們需要冒泡5次,即n-1次。
這裏寫圖片描述
代碼如下:

void BubbleSort(int a[],int length)
{
    int i,j;
    for(i=1;i<length;i++)
    {
        for(j=0;j<=length-i-1;j++)
        {
            if(n[j]>n[j+1])
            {
                n[j]=n[j]^n[j+1];
                n[j+1]=n[j]^n[j+1];
                n[j]=n[j]^n[j+1];
            }
        }
    }
}

冒泡排序的優化

這樣的冒泡是否還能繼續優化呢?答案是肯定的,試想一下,如果我們待排序的數組是a[6]={2,1,3,4,5,6},也就是說,除了a[0]和a[1]需要交換外,其他都不需要交換。如果我們還像上述方法進行冒泡,會有大部分的操作是沒有必要的,這時候我們可以增加一個標記變量change來實現這一算法的改進。當某一層冒泡並沒有關鍵字的交換時,意味這序列已經滿足要求,這時change不會被置1,循環終止。

void BubbleSort(int a[])
{
    int n=sizeof(a)/sizeof(int);
    int i,j;
    int change=1;
    for(i=1;i<n && change;i++)
    {
        change=0;
        for(j=0;j<=n-i-1;j++)
        {
            if(n[j]>n[j+1])
            {
                n[j]=n[j]^n[j+1];
                n[j+1]=n[j]^n[j+1];
                n[j]=n[j]^n[j+1];
                change=1;
            }
        }
    }
}

注:冒泡算法的時間複雜度爲O(n^2)。

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