排序演算法一--氣泡排序
氣泡排序(BubbleSort)
基本思想:兩個數比較大小,較大的數下沉,較小的數冒起來
思路:
比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。
對每一對相鄰元素做同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。
針對所有的元素重複以上的步驟,除了最後一個。
持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較
舉例說明:要排序陣列:int[] arr={6,3,8,2,9,1};
第一趟排序:
第一次排序:6和3比較,6大於3,交換位置: 3 6 8 2 9 1
第二次排序:6和8比較,6小於8,不交換位置:3 6 8 2 9 1
第三次排序:8和2比較,8大於2,交換位置: 3 6 2 8 9 1
第四次排序:8和9比較,8小於9,不交換位置:3 6 2 8 9 1
第五次排序:9和1比較:9大於1,交換位置: 3 6 2 8 1 9
第一趟總共進行了5次比較, 排序結果: 3 6 2 8 1 9
---------------------------------------------------------------------
第二趟排序:
第一次排序:3和6比較,3小於6,不交換位置:3 6 2 8 1 9
第二次排序:6和2比較,6大於2,交換位置: 3 2 6 8 1 9
第三次排序:6和8比較,6大於8,不交換位置:3 2 6 8 1 9
第四次排序:8和1比較,8大於1,交換位置: 3 2 6 1 8 9
第二趟總共進行了4次比較, 排序結果: 3 2 6 1 8 9
---------------------------------------------------------------------
第三趟排序:
第一次排序:3和2比較,3大於2,交換位置: 2 3 6 1 8 9
第二次排序:3和6比較,3小於6,不交換位置:2 3 6 1 8 9
第三次排序:6和1比較,6大於1,交換位置: 2 3 1 6 8 9
第二趟總共進行了3次比較, 排序結果: 2 3 1 6 8 9
---------------------------------------------------------------------
第四趟排序:
第一次排序:2和3比較,2小於3,不交換位置:2 3 1 6 8 9
第二次排序:3和1比較,3大於1,交換位置: 2 1 3 6 8 9
第二趟總共進行了2次比較, 排序結果: 2 1 3 6 8 9
---------------------------------------------------------------------
第五趟排序:
第一次排序:2和1比較,2大於1,交換位置: 1 2 3 6 8 9
第二趟總共進行了1次比較, 排序結果: 1 2 3 6 8 9
---------------------------------------------------------------------
最終結果:1 2 3 6 8 9
平均時間複雜度:O(n2)
程式碼實現(java):
public static void BubbleSort(int [] arr){
int temp;//臨時變數
for(int i=0; i<arr.length-1; i++){ //表示趟數,一共arr.length-1次
for(int j=arr.length-1; j>i; j--){
if(arr[j] < arr[j-1]){
temp = arr[j];
arr[j] = arr[j-1];
arr[j-1] = temp;
}
}
}
}
優化:
-
針對問題:
資料的順序排好之後,冒泡演算法仍然會繼續進行下一輪的比較,直到arr.length-1次,後面的比較沒有意義的。 -
方案:
設定標誌位flag,如果發生了交換flag設定為true;如果沒有交換就設定為false。
這樣當一輪比較結束後如果flag仍為false,即:這一輪沒有發生交換,說明資料的順序已經排好,沒有必要繼續進行下去。
public static void BubbleSort1(int [] arr){
int temp;//臨時變數
boolean flag;//是否交換的標誌
for(int i=0; i<arr.length-1; i++){ //表示趟數,一共arr.length-1次。
flag = false;
for(int j=arr.length-1; j>i; j--){
if(arr[j] < arr[j-1]){
temp = arr[j];
arr[j] = arr[j-1];
arr[j-1] = temp;
flag = true;
}
}
if(!flag) break;
}
}