起泡排序(氣泡排序)新理解
以前學起泡排序的時候只是知道它的思路及實現,並沒有好好總結歸納一下,那麼現在就來補充一下。
首先假設初始鍵值序列為 [50 13 55 97 27 38 49 65]
第一趟排序結果為 [13 50 55 27 38 49 65] 97
第二趟排序結果為 [13 50 27 38 49] 55 65 97
第三趟排序結果為 [13 27 38 49] 50 55 65 97
第四趟排序結果為 13 27 38 49 50 55 65 97
那麼我們整個待排序列是分為了有序區和無序區(右邊和左邊):有序區是沒有被方括號括著的,無序區是被方括號括著的,一開始沒有排序,所以初始有序區為空,因為氣泡排序每次都是兩兩比較,大的一方像起泡一樣不斷向右移,只要後面的數比它小,那麼每一輪必然會從無序區選出最大的數
那麼我們首先用一般的思路來實現它
public void BubbleSort(int a[]){ for(int i=a.length;i>0;i--){ for(int j=0;j<i;j++){ if(a[j+1]<a[j]){ temp = a[j]; a[j] = a[j+1]; a[j+1]=temp; } } } }
首先第一次排序的區間是[1,a.length],那麼隨著不斷排序,有序區元素增加,那麼有序區的元素我們是不用排的,我們只需排列無序區,而我們一般思路的排序就是每次排列[1,a.length--],這個區域的數,因為每次會排出最大的數到有序區,所以為a.length--, 那麼這是一般實現
然後第二點我想說的是,既然可以採用這種不斷冒泡每次選出較大的數,那麼相反也可以利用這種思想每次選出最小的數,這個比較好實現,所以這裡就不想談了
最後主要想說的是我們如何優化這種演算法,而且我們上面每趟的結果實際是演算法優化後的結果,如果沒有優化的話,陣列有多少個元素就會有多少趟,但是這樣演算法就不夠好了,所以這裡寫一下優化的演算法
public void BubbleSort(int a[]){
int exchange =a.length;
while(exchange!=0){
int bound=exchange-1;exchange=0;
for(int i=o;i<bound;i++){
if(a[i]>a[i+1]){
temp = a[i];
a[i] = a[i+1];
a[i+1]=temp;
exchange = i;
}
}
}
}
這裡我簡單說一下優化演算法的思路,引入exchange這個暫存變數是為了記錄每次交換的位置,這是我們為了避免像上面第二趟排序的時候,65在原地不動這種情況。我們每次只有在有大小存在是數要移動時才記錄exchange,否則不記錄,則我們不移動,也就是存在像65在原地不動的這種情況。上面exchange=0是為了終止while迴圈,否則將一直迴圈下去。