排序一:冒泡以及三種優化
阿新 • • 發佈:2018-11-16
/**
* 冒泡以及三種優化
* */
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;//第一個確定了 } } }