1. 程式人生 > >氣泡排序演算法的原理與實現

氣泡排序演算法的原理與實現

氣泡排序

基本思想:在待排序的一組數中,對當前還未排好序的範圍內的全部數,自上而下對相鄰的倆個數依次進行比較和調整,讓較大的數往下沉,較小的數往上冒。即 當相鄰的倆個數比較好發現它們的排序與排序要求相反時,就將它們互換。

氣泡排序的示例:對 49 38 65 97 76 13 27 49進行冒泡演示。

初始順序:49 38 65 97 76 13 27 49 按照從小到大冒泡

第一趟排序: 38 49 65 76 13 27 49 97
第一趟排序原理: 第一條記錄49與第二條記錄38比較 根據排序要求(從小到大冒泡即 小的上冒 大的下沉) 49 下沉 38 上冒 陣列變成(38 49 65 97 76 13 27 49),接著用第二條記錄49與第三條記錄65比較,根據排序要求 陣列保持原樣(38 49 65 97 76 13 27 49),以此類推第。直到最後一條記錄。 第一趟排序的結果是(38 49 65 76 13 27 49 97)

第二趟排序:38 49 65 13 27 49 76 97

第三趟排序:38 49 13 27 49 65 76 97

第四趟排序:38 13 27 49 49 65 76 97

由冒泡演示的示例得:冒泡每趟迴圈存在多個位置上的資料的變化,相鄰的倆個數比較好發現它們的排序與排序要求相反時,就將它們互換,這與前面說的簡單選擇排序不同,簡單選擇排序每趟迴圈最多倆個位置的數互換–>即倆個位置發生變化。

基於上述的思想的一種程式碼實現。

@Test
     public void test1(){
         //定義待排序的陣列 49,38,65,97,76,13,27,49
int a[] ={49,38,65,97,76,13,27,49}; //定義中間變數 用於倆個數字交換時的轉換 int tmp; for(int i = 0; i<a.length; i++){ for(int j = 0;j<a.length-i-1;j++){ //j<a.length-i-1中-i可以省略,省略之後只是多比較了幾次,但是-1不能省略,如果不-1,即當j=a.length,for迴圈中j++會越界,因此j只能-1.使j不能取到最後一條記錄,此時j++能取到最後一條。
if(a[j]>a[j+1]){ //前一個元素>後一個 則大的下沉 小的上冒。 tmp = a[j]; a[j] = a[j+1]; a[j+1] = tmp; } } } System.out.println(Arrays.toString(a)); }

總結

  1. 氣泡排序的思想就是相鄰的倆個位置比較,不符合排序要求就交換位置,專業術語交上冒和下沉。
  2. 氣泡排序中的交換操作相對簡單選擇排序來說,是比較多的

缺點:傳統的氣泡排序中每一趟排序只能找到一個最大值或最小值,效率低。

我們考慮利用在每一趟排序中進行正向和反向倆遍冒泡的方法一次可以得到倆個最終值(最大值和最小值),從而使排序趟數減少了一半,就是後面要說的冒泡演算法的改進