1. 程式人生 > >Java演算法之氣泡排序—BubbleSort

Java演算法之氣泡排序—BubbleSort

 

程式碼如下:

public static void main(String[] args) {
  int[] arr = { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 };
  for (int i = 0; i < arr.length - 1; i++) {// 外層迴圈控制排序趟數
    for (int j = 0; j < arr.length - 1 - i; j++) {// 內層迴圈控制每一趟排序多少次
      if (arr[j] > arr[j + 1]) {
        int temp = arr[j];
        arr[j] = arr[j + 1];

        arr[j + 1] = temp;
      }
    }
  }

  for (int i = 0; i < arr.length; i++) {
    System.out.println(arr[i]);
  }

}

 

氣泡排序的效率

  通過觀察arr陣列可以看到,第一次排序時進行了9次比較,第二次排序時進行了8次比較,如此類推,直到最後一次進行比較。

  對於10個數據項,就是9+8+7+6+5+4+3+2+1=45

  一般來說,陣列中有N個數據項,則第一次排序中有N-1次比較,第二次排序中有N-2次比較,以此類推。這樣徐磊的求和公式如下

    (N-1)+(N-2)+(N-3)+ ... + 1 = N*(N-1)/2

  當N為10時,N*(N-1)/2等於45(10*9)/2

  這樣演算法作了約N*N次比較(忽略減1,不會有很大差異,特別是當N很大時)

  因為兩個值只有在需要是才會交換,所有見換的次數少於比較的次數。如果資料是隨機的,那麼大概有一半的資料需要交換,則交換次數為N*N/4(不過在最壞的情況下,即初始資料逆序時,每次比較都需要交換,也就是上面的案例程式碼)。

  交換和比較操作冊數都和N²成正比。由於常熟不算在大O表示法中,可忽略2和4,並且認為氣泡排序裕興需要O(N²)時間級別。執行資料越多,就越能看出氣泡排序的速度是很慢的。

  只要看到一個迴圈巢狀在另一個迴圈裡,如氣泡排序等,就可以懷疑這個演算法的執行時間為O(N²)級。外層迴圈執行N次,內部迴圈對於每一次外層迴圈都執行N次。這就意味著將大約需要執行N*N或者N²次某個基礎操