冒泡排序

冒泡排序基本思想:

冒泡排序是交換排序的一種,兩兩比較待排序的關鍵字,發現兩個記錄的次序相反時即進行交換。

在冒泡排序的過程中,關鍵字小的記錄好比水中的氣泡逐趟向上漂浮,而關鍵字大的記錄好比石塊往下沉,每一趟有一個最大的石頭沉搭到水底。

 

排序過程:

首先將第一個記錄的關鍵字和第二個記錄的關鍵字進行比較,若爲逆序(即source[1].key>source[2].key),則交換兩個記錄。

以此類推,直到第n-1個記錄和第n個記錄的關鍵字進行比較,這個過程稱作第一趟排序,其結果使得最大的記錄被安置到最後一個記錄的位置上。

 

冒泡排序效率

若初始序列爲“正序”,則只需要進行一趟排序,在排序過程中進行n-1次關鍵字的比較,且不移動記錄;

若初始序列爲“逆序”,則需要進行n-1趟排序,在排序過程中進行n(n-1)/2次關鍵字的比較,並做等數量級的記錄移動。

因此,總的時間複雜度爲O(n2), 最好時間複雜度爲O(n)。

冒泡排序穩定性:

在待排序的文件中,若存在多個關鍵字相同的記錄,經過排序後,這些具有相同關鍵字的記錄之間的相對次序保持不變,則稱該方法是穩定的。

冒泡排序時就地排序,因此他是穩定的。

 

JAVA實現的冒泡排序:

public class BubbleSort {

 //bubbleSort 實現

 public static void bubbleSort(int[] source) {

  boolean flag = false;                                     //設置交換標誌
  for(int i=source.length-1;i>0;i--) {
   for(int j=0; j<i; j++) {
    if (source[j] > source[j+1]) {
     swap(source, j, j+1);

    flag = true;                                               //表示在這趟排序過程中進行了交換
    }

    if(!flag) {                                                  //本趟排序未進行交換,提前返回

     return;

     }
   }
  }  
 }


 //交換函數swap
 public static void swap(int[] source, int i, int j) {
  int temp = source[i];
  source[i] = source[j];
  source[j] = temp;
 }

  //測試上面的bubbleSort方法
  
public static void main(String[] args) {
     int test[] = {23,5,21,2,2,2,43,54,6,77};
     bubbleSort(test);
     for(int i=0; i<test.length;i++) {
      System.out.println(test[i]);
     }
 }
}

 

輸出結果:

2
2
2
5
6
21
23
43
54
77

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章