间隔大移动次数少,间隔小移动距离短。
public class ShellSort { public static void main(String[] args) { int[] arr = {9, 6, 11, 3, 5, 12, 8, 7, 10, 15, 14, 4, 1, 13, 2}; sort(arr); print(arr); } /** * 希尔排序 * * @param arr */ private static void sort(int[] arr) { for (int gap = arr.length / 2; gap > 0; gap /= 2) { // 默认第一位排好序,从第二位开始 for (int i = gap; i < arr.length; i++) { // 外层相当于从无序中抽牌 for (int j = i; j > gap - 1; j -= gap) { // 遍历有序的 进行比较换位置 if (arr[j] < arr[j - gap]) { swap(arr, j, j - gap); } } } } } private static void swap(int[] arr, int i, int j) { int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } private static void print(int[] arr) { for (int i : arr) { System.out.print(i + " "); } } }
优化gap:
Knuth序列
h = 1
h = 3*h +1
/** * 希尔排序 * * @param arr */ private static void sort(int[] arr) { int h = 1; while (h < arr.length / 3) { h = h * 3 + 1; } for (int gap = h; gap > 0; gap = (gap + 1) / 3) { // 默认第一位排好序,从第二位开始 for (int i = gap; i < arr.length; i++) { // 外层相当于从无序中抽牌 for (int j = i; j > gap - 1; j -= gap) { // 遍历有序的 进行比较换位置 if (arr[j] < arr[j - gap]) { swap(arr, j, j - gap); } } } } }
原文:https://www.cnblogs.com/huan30/p/12837584.html