【經典算法】冒泡排序

冒泡算法

冒泡排序:從序列的一端開始往另外一端冒泡,依次比較相鄰的兩個數的大小。算法

設數組長度爲N。數組

1.每輪比較相鄰的先後兩個數據,若是前面數據大於或者小於後面的數據,就將二個數據交換。優化

2.這樣每輪對數組的第0個數據到N-1個數據進行一次遍歷後,最大或者最小的一個數據就到數組第N-1個位置。spa

3.   第一輪比較到下標爲N-1的數據(最後一個),之後每次比較都-1。指針

#include <stdio.h>

    int main () {
    int list[10] = {5,23,86,21,43,67,45,34,58,23};
    int i, j, temp;
    for (i = 0; i < 10 - 1 ; i++)
        for (j = 1; j < 10 - i; j++)
        if (list[j - 1] > list[j])
    {
        temp = list[j - 1];
        list[j - 1] = list[j];
        list[j] = temp;
    }
    for (i = 0;i < 10; i++)
        printf("%d\n",list[i]);
}

 

優化算法

冒泡有一個最大的問題就是無論序列有序仍是沒序,雙層循環的每一次比較都執行了。code

下面對其進行優化,設置一個標誌,若是這一輪發生了交換,則爲1,不然爲0。blog

若是有一趟沒有發生交換,說明排序已經完成,則結束排序。排序

#include <stdio.h>

    int main () {
    int list[10] = {5,23,86,21,43,67,45,34,58,23};
    int  j, temp;
    int  i = 10;
    int bool = 1;
    while(bool)
    {    
        bool = 0;
        for (j = 1; j < i; j++)
            if (list[j - 1] > list[j])
        {
            temp = list[j - 1];
            list[j - 1] = list[j];
            list[j] = temp;
            bool = 1;
        }
        i--;
    }
    for (i = 0;i < 10; i++)
        printf("%d\n",list[i]);
}

 

 

 

圖解冒泡排序

以 [ 8,2,5,9,7 ] 這組數字來作示例:get

從左往右依次冒泡,將小的往右移動io

第一輪冒泡:

首先比較第一個數和第二個數的大小,咱們發現 2 比 8 要小,那麼保持原位,不作改動。位置仍是 8,2,5,9,7 。

指針往右移動一格,接着比較:

比較第二個數和第三個數的大小,發現 2 比 5 要小,因此位置交換,交換後數組更新爲:[ 8,5,2,9,7 ]。

指針再往右移動一格,繼續比較:

比較第三個數和第四個數的大小,發現 2 比 9 要小,因此位置交換,交換後數組更新爲:[ 8,5,9,2,7 ]

一樣,指針再往右移動,繼續比較:

比較第 4 個數和第 5 個數的大小,發現 2 比 7 要小,因此位置交換,交換後數組更新爲:[ 8,5,9,7,2 ]

下一步,指針再往右移動,發現已經到底了,則本輪冒泡結束,處於最右邊的 2 就是已經排好序的數字。

經過這一輪不斷的對比交換,數組中最小的數字移動到了最右邊。

 

第二輪冒泡:

 

 

 

 


因爲右邊的 2 已是排好序的數字,就再也不參與比較,因此本輪冒泡結束,本輪冒泡最終冒到頂部的數字 5 也歸於有序序列中,如今數組已經變化成了[ 8,9,7,5,2 ]。

 

 

第三輪冒泡:

因爲 8 比 7 大,因此位置不變,此時第三輪冒泡也已經結束,第三輪冒泡的最後結果是[ 9,8,7,5,2 ]

 

 

第四輪冒泡:

 

 9 和 8 比,位置不變,即肯定了 8 進入有序序列,那麼最後只剩下一個數字 9 ,放在末尾,自此排序結束。

 

參考:https://mp.weixin.qq.com/s/D0-lOLFkfppTnvN9yK_lBg

相關文章
相關標籤/搜索