1. 程式人生 > >排序一:冒泡以及三種優化

排序一:冒泡以及三種優化

/**
 * 冒泡以及三種優化
 * */

public class One {
    /**
     * 經典
     * */
    public static void one(int[] arr) {
    
        for(int i=0;i<arr.length-1;i++) {
            for(int j=1;j<arr.length-i;j++) {
                if(arr[j-1] > arr[j]) {
                    int temp = arr[j-1];
                    arr[j
-1] = arr[j]; arr[j] = temp; } } } } /** *優化一 ,加入標誌,判斷上一輪是否有過交換 **/ public static void two(int[] arr) { boolean exchange = false; for(int i=0;i<arr.length-1;i++) { //比較n-1趟 for(int j = 1;j <arr.length-i;j++) { //
j從1開始, 有i個數據已經排序好了 if(arr[j-1] >arr[j]) { int temp = arr[j-1]; arr[j-1] = arr[j]; arr[j] = temp; if(!exchange) exchange = true; } } if(!exchange) break;//判斷這一趟是否有交換資料,沒有交換資料表明已經排好序
} } /** * 優化二,在每一趟中,對已經排好序的不去進行比較 * */ public static void three(int[] arr) { int end = 1; int pos = 1; while(end >0) { for(int j = 1;j <end;j++) { //j從1開始, 有i個數據已經排序好了 if(arr[j-1] >arr[j]) { int temp = arr[j-1]; arr[j-1] = arr[j]; arr[j] = temp; pos = j; } } end = pos - 1; } } /** * 優化三、每次迴圈,正反兩次冒泡 * */ public static void four(int[] arr) { int temp =0; int low =0; int high = arr.length-1; int count =1;//躺數 while(low<high) { for(int i = low;i<high;i++) { //正向冒泡,確定最大值 if(arr[i] >arr[i+1]) { temp = arr[i+1]; arr[i+1] = arr[i]; arr[i] = temp; } } --high; //最後一個確定 for(int i = high ;i>low ;i--) { //確定最小值 if(arr[i] < arr[i-1]) { temp = arr[i+1]; arr[i+1] = arr[i]; arr[i] = temp; } } ++low;//第一個確定了 } } }