插入排序-希爾排序
阿新 • • 發佈:2018-12-12
/* * Java實現希爾排序(縮小增量排序) *兩個步驟:1,建堆 2,對頂與堆的最後一個元素交換位置 */ public class ShellSort { 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[]) { // 列印方法 for (int i = 0; i < a.length; i++) { if (i == 0) { System.out.print("["); } else if (i == a.length - 1) { System.out.print(a[i] + "]"); break; } System.out.print(a[i] + " "); } } public static void shellSort(int[] a) { int dk = a.length / 2; while (dk >= 1) { ShellInsertSort(a, dk); dk = dk / 2; } } // 類似插入排序,只是插入排序增量是1,這裡增量是dk,把1換成dk就可以了 public static void ShellInsertSort(int[] a, int dk) { for (int i = dk; i < a.length; i++) { 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; // 插入 } } } }
解析版本:
解析版本不用看,直接複製到eclipse中,執行,輔助理解。
/* * Java實現希爾排序(縮小增量排序) *兩個步驟:1,建堆 2,對頂與堆的最後一個元素交換位置 */ public class ParseShellSort { 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[]) { // 列印方法 for (int i = 0; i < a.length; i++) { if (i == 0) { System.out.print("["); } else if (i == a.length - 1) { System.out.print(a[i] + "]"); break; } System.out.print(a[i] + " "); } } 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); // 輸出過程 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(" 交換成功!"); } } } }