1. 程式人生 > >起泡排序(氣泡排序)新理解

起泡排序(氣泡排序)新理解

以前學起泡排序的時候只是知道它的思路及實現,並沒有好好總結歸納一下,那麼現在就來補充一下。

首先假設初始鍵值序列為 [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迴圈,否則將一直迴圈下去。