1.希尔排序的概念
在上一篇中我讲到了插入排序(http://blog.youkuaiyun.com/u013252047/article/details/79222503),希尔排序就是在插入排序上做了点变动。那为什么出现希尔排序呢?上一篇中我也讲到了,当初始序列无序时,插入排序每次只能将数据移动一位,效率较低,当初始序列基本有序时,直接插入只需经过少量的比较即可完成排序。于是就出现了希尔排序。希尔排序的基本思想是:先取一个小于n的整数d1作为第一个增量,把文件的全部记录分组。所有距离为d1的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量 dt=1( dt<dt-1 …<d2<d1),即所有记录放在同一组中进行直接插入排序为止。
2.图解,用画图来一步一步实现是怎么排序的
3.代码实现
$array = [12,56,98,32,16,34,2,9,1];
function shellInsertSort(&$array,$n,$dk){
for ($i=$dk;$i<$n;$i++) {
$target = $array[$i];
$j = $i;
while (($j-$dk)>=0 && $target<$array[$j-$dk]) {
$array[$j] = $array[$j-$dk];
$j-=$dk;
}
$array[$j] = $target;
}
}
function shellSort(&$array,$n) {
$dk = (int)($n / 2); //步调
while ($dk >= 1) {
shellInsertSort($array,$n,$dk);
$dk = (int)($dk / 2);
}
}
$len = count($array);
shellSort($array,$len);
dump($array);
4.效果展示
希尔排序是不稳定的,因为元素之间的比较是各个子序列中的元素比较。相对于整个待排序列而言,某一个元素可能会跳跃性地移动。
用这个例子和插入排序相比,插入排序交换了27次,希尔排序交换了13次,交换的次数变少了。
效果展示来自http://blog.jobbole.com/11745/