冒泡排序:從序列的一端開始往另外一端冒泡,依次比較相鄰的兩個數的大小。算法
設數組長度爲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 ,放在末尾,自此排序結束。