Shell sort是对插入排序的扩展,但是比插入排序速度快很多。
做了一个有趣的对比试验,比较shell sort和merge sort。
先把需要排序的数组分为大(>1M),中(1K<1M),小(< 1K),惊奇的发现,shell sort 在小数组比merge sort快,在中数组速度表现相类似,然而在大数组上比merge差了些。
假如我们的所要排序的数组相对不是特别大,shell sort是个不错的选择。
另外,shell sort不需要额外分配空间(merge需要分配额外空间)。
一下是shell sort 的Java 实现。
public static void shellSort(int[] arr) {
int n = arr.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 && arr[j] < arr[j - h]; j -= h) {
swap(arr, j, j - h);
}
}
h /= 3;
}
}
private static void swap(int[] arr, int i, int j) {
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}