天天看點

排序算法之冒泡排序

冒泡排序是一種非常常見的排序算法。如同水中的一排泡泡,先冒出最大的一個泡泡。再冒出剩餘泡泡中的最大泡泡,依次類推,它的排序規則如下:

  1. 從第一個元素開始,比較相鄰的兩個元素,如果後面的小于前面的,交換兩個的位置,一直比較到最後一個
  2. 循環1中的操作,但已經确定的最大的元素不再參與比較
  3. 直到不确定大小順序的元素剩餘兩個,然後對這兩個進行比較,然後結束循環

排序圖示(圖檔來源網絡)

排序算法之冒泡排序

java實作

用java實作一個簡單的冒泡排序。為了便于了解,在尋找到第一個最大元素完成後,稱之為第一趟,依次類推,可以發現一共需要n-1趟

public void bubbleSort() {
    int[] array = {6, 2, 5, 3};
    for (int i = 0; i < array.length - 1; i++) {// 需要排序的趟數
      for (int j = 0; j < array.length - i - 1; j++) {// 每一趟需要比較的次數
        if (array[j + 1] < array[j]) {
          int variable = array[j + 1];
          array[j + 1] = array[j];
          array[j] = variable;
        }
      }
      System.out.println("第" + (i + 1) + "趟排序後的結果:" + Arrays.toString(array));
    }
    System.out.println("最終的排序結果:" + Arrays.toString(array));
  }
           

console

第1趟排序後的結果:[2, 5, 3, 6]
第2趟排序後的結果:[2, 3, 5, 6]
第3趟排序後的結果:[2, 3, 5, 6]
最終的排序結果:[2, 3, 5, 6]
           

排序過程分析

第一趟排序

排序前:[6, 2, 5, 3]
排序後:[2, 5, 3, 6]
6與2比較,然後互換位置,然後與5比較,互換位置,最後與3比較,互換位置,此時6在最後的位置,确定最大值6,一共比較3次
           

第二趟排序

排序前:[2, 5, 3, 6]
排序後:[2, 3, 5, 6]
2與3比較,位置不變,然後5與3比較,然後互換位置,因為6的位置已經确定,是以5與6不再比較,一共比較2次
           

第三趟排序

排序前:[2, 3, 5, 6]
排序後:[2, 3, 5, 6]
2與3比較,位置不變,5,6的位置已經确定,是以不再比較,一共比較1次
           

由上面的分析可以看出,一共進行了1+2+...+n-1次比較。也就是n(n-1)/2次,即(N^2 - n)/2次,去除對結果影響不大的N^2 - n中的-n,以及系數0.5,得出時間複雜度為 O(N^2) (注:此處的時間複雜度自己尚未完全了解,希望明白的朋友可以給予解答)

優化

上述的排序還存在優化的空間,如果本來就是一列從小到大的數,按上述操作,很容易造成資源浪費。最理想的情況下,對于一列從小到大的數,進行n次比較,即可得出結果。如果某一趟排序中,沒有出現互換操作,即表示已經得到了正确的結果,此時可以結束排序,示例如下:

public void bubbleSort() {
    int[] array = {6, 2, 5, 3};
    for (int i = 0; i < array.length - 1; i++) {// 需要排序的趟數
      boolean flag = false;// 預設不存在位置交換
      for (int j = 0; j < array.length - i - 1; j++) {// 每一趟需要比較的次數
        if (array[j + 1] < array[j]) {
          flag = true;// 存在位置交換,修改flag為true
          int variable = array[j + 1];
          array[j + 1] = array[j];
          array[j] = variable;
        }
      }
      if (!flag) {
        break;// 不存在位置交換 跳出循環
      }
    }
    System.out.println("最終的排序結果:" + Arrays.toString(array));
  }
           
排序算法之冒泡排序

作者:zhaoguhong(趙孤鴻)

出處:http://www.cnblogs.com/zhaoguhong/

個人部落格:http://www.zhaoguhong.com

本文版權歸作者和部落格園共有,轉載請注明出處

繼續閱讀