交換排序-快速排序
阿新 • • 發佈:2018-12-12
public static void main(String[] args) { int a[] = { 3, 1, 5, 7, 2, 4, 9, 6, 10, 8 }; System.out.print("初始值:"); print(a); shellSort(a); System.out.print("\n排序後:"); print(a); } public static void print(int a[], int... n) { outer:for (int i = 0; i < a.length; i++) { if (i == 0) { System.out.print("["); } for (int j : n) { if(i==j){ System.out.print("*" + a[i] + "*"); if (i == a.length - 1) { System.out.print("]"); } continue outer; } } System.out.print(" " + a[i] + " "); if (i == a.length - 1) { System.out.print("]"); } } } public static void shellSort(int[] a) { int dk = a.length / 2; System.out.println("\r\n交換過程:"); while (dk >= 1) { System.out.println(" 開始一輪比對:"); // 輸出過程 ShellInsertSort(a, dk); dk = dk / 2; System.out.println(); } } // 類似插入排序,只是插入排序增量是1,這裡增量是dk,把1換成dk就可以了 public static void ShellInsertSort(int[] a, int dk) { for (int i = dk; i < a.length; i++) { System.out.print(" 當前陣列:"); // 輸出過程 print(a,i,i-dk); // 輸出過程 System.out.println("\t比較元素:" + "a[" + i + "]:" + a[i] + " \t" + "a[" + (i - dk) + "]:" + a[i - dk]); // 輸出過程 if (a[i] < a[i - dk]) { int j; int x = a[i];// x為待插入元素 a[i] = a[i - dk]; for (j = i - dk; j >= 0 && x < a[j]; j = j - dk) {// 通過迴圈,逐個後移一位找到要插入的位置。 a[j + dk] = a[j]; } a[j + dk] = x;// 插入 System.out.println(" 交換成功!"); } } }
解析版本:
解析版本不用看,直接複製到eclipse中,執行,輔助理解。
public static void main(String[] args) { int a[] = { 3, 1, 5, 7, 10, 4, 9, 6, 2, 8 }; System.out.println("初始值:"); print(a); System.out.println("\r\n交換過程:"); int h = a.length - 1; quickSort(a, 0, h); System.out.println("\n排序後:"); print(a); } public static void print(int a[]){ for (int i = 0; i < a.length; i++) { if (i == 0) { System.out.print("[{"); } System.out.print(" " + a[i] + " "); if (i == a.length - 1) { System.out.print("]"); } } } public static void print(int a[], int... n) { outer:for (int i = 0; i < a.length; i++) { if (i == 0) { System.out.print("["); } if(i==n[1]){ System.out.print("{ "); } System.out.print(" "); if(i==n[0]){ System.out.print("} *"); } System.out.print(a[i]); if(i==n[0]){ System.out.print("* {"); } System.out.print(" "); if(i==n[2]){ System.out.print("} "); } if (i == a.length - 1) { System.out.print("]"); } } } public static void quickSort(int[] a, int low, int high) { //迭代進行快速排序 if (low < high) { // 如果不加這個判斷遞迴會無法退出導致堆疊溢位異常 int middle = getMiddle(a, low, high); quickSort(a, 0, middle - 1); // 遞迴對低子表遞迴排序 quickSort(a, middle + 1, high); // 遞迴對高子表遞迴排序 } } public static int getMiddle(int[] a, int low, int high) { int l1 = low; int h1 = high; int key = a[low]; // 基準元素,排序中會空出來一個位置 while (low < high) { while (low < high && a[high] >= key) { // 從high開始找比基準小的,與low換位置 high--; } a[low] = a[high]; while (low < high && a[low] <= key) { // 從low開始找比基準大,放到之前high空出來的位置上 low++; } a[high] = a[low]; } a[low] = key;// 此時low=high 是基準元素的位置,也是空出來的那個位置 System.out.print(" 當前陣列:"); // 輸出過程 print(a,low,l1,h1); // 輸出過程 System.out.println(" middle值:" + "a[" + low + "]:" + key+" low="+l1+",high="+h1); // 輸出過程 return low; }