算法自学笔记:希尔排序
作者:互联网
希尔排序可以理解为插入排序的升级版。在插入排序中,如果发现位置靠后的元素比位置靠前的元素小,会一个个比较元素直到移到正确位置,这一做法会带来频繁比较和交换操作,因而效率低。而希尔排序一次比较跨度大于1,排序一轮后减小比较的跨度,直到等于1.这么做可以使最后一轮插入排序时数组已经基本上排列有序,减少频繁交换。
对于按照跨度大小A排序后的数组,再按照跨度B排序时,原来按跨度A交换的各元素位置不会改变(证明很困难,就当定理即可)
希尔排序选取合适的区间跨度很重要,一个常用的方法是选取3n + 1作为增幅,还有一个更快的方法是Sedgewick数列:1 5 19 41 109 209 505 929 2161 3905…… ,但是该方法程序实现较难,而且样本较小时加速不明显。
希尔排序的性能至今未解,不过可以确定对于中等大小的数组希尔排序效率较高,而且希尔排序代码简单,是性能不错的排序算法。
实例代码:
public static void sort (Comparable[] a) {
int h = 1;
// find the largest h for the input
while (h < a.length / 3) {
h = h * 3 + 1;
}
while (h >= 1) {
// same process as insertion sort
for (int i = h; i < a.length; i++) {
for (int j = i; j >= h; j -= h) {
if (less(a[j], a[j - h])) {
exch(a, j, j - h);
} else {
break;
}
}
}
// decrease h
h /= 3;
}
}
如程序所示,首先使用一个while循环找到初始最大h值,然后的排序操作和插入排序完全一致,除了把j变量变动幅度由1改为h,然后h除以3,以较小幅度进行下一轮排序,直到h为1,最后一轮插入排序。
标签:int,插入排序,while,希尔,自学,排序,跨度 来源: https://blog.csdn.net/Raine_Yang/article/details/120392291