Java排序演算法-氣泡排序以及優化
阿新 • • 發佈:2019-01-08
繼上一篇博:
氣泡排序:
如何理解:
兩個數比較大小,較大的數下沉,較小的數冒起來。
過程:
- 比較相鄰的兩個資料,如果第二個數小,就交換位置。
- 從後向前兩兩比較,一直到比較最前兩個資料。最終最小數被交換到起始的位置,這樣第一個最小數的位置就排好了。
- 繼續重複上述過程,依次將第2.3...n-1個最小數排好位置。
實現:
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,即:這一輪沒有發生交換,說明資料的順序已經排好,沒有必要繼續進行下去。
實現程式碼:
package com.temp; /** * 氣泡排序 * @author Mr.L * */ public class A { 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; for (int k = 0; k <arr.length; k++) { System.out.println(arr[k]); } } } public static void main(String[] args) { // 建立arr int 陣列 int [] arr= {1,3,2,5,6}; // 呼叫 BubbleSort1(arr); } }
輸出如下:
歡迎各路大神指正錯誤,。