- 希尔排序
public class ShellSort {
public static void sort(Comparable[] a) {
int n = a.length;
int h = 1;
while (h < n / 3) h = 3 * h + 1;
while (h >= 1) {
for (int i = h; i < n; i++) {
for (int j = i; j >= h && less(a[j], a[j - h]); j -= h) {
exch(a, j, j - h);
}
}
assert isHsorted(a, h);
h /= 3;
}
assert isSorted(a);
}
private static boolean less(Comparable v, Comparable w) {
return v.compareTo(w) < 0;
}
private static void exch(Object[] a, int i, int j) {
Object swap = a[i];
a[i] = a[j];
a[j] = swap;
}
private static boolean isSorted(Comparable[] a) {
for (int i = 1; i < a.length; i++)
if (less(a[i], a[i-1])) return false;
return true;
}
private static boolean isHsorted(Comparable[] a, int h) {
for (int i = h; i < a.length; i++)
if (less(a[i], a[i-h])) return false;
return true;
}
}
- 选择与插入排序的区别
插入排序在输入本身已经基本排序好时,速度非常快
- 排序的稳定性
A stable sort preserves the relative order of items with equal keys.
In a stable sort, equal items never move past each other.
插入排序和归并排序时稳定的,选择排序和希尔排序是不稳定的