间隔大移动次数少,间隔小移动距离短。
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);
}
}
}
}
}