目录
原理
希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序,同时该算法是冲破O(n2)的第一批算法之一。它与插入排序的不同之处在于,它会优先比较距离较远的元素
希尔排序是按照不同步长对元素进行插入排序,当刚开始元素很无序的时候,步长最大,所以插入排序的元素个数很少,速度很快;当元素基本有序了,步长很小,插入排序对于有序的序列效率很高
- 分组
- 缩小增量
- 直接插入
图解
代码
<?php
function shellSort(&$arr){
$count = count($arr);
$inc = $count;
while ($inc > 1) {
//计算增量
//$inc = floor($inc / 3) + 1;
$inc = ceil($inc / 2);
for ($i = $inc; $i < $count; $i++) {
$temp = $arr[$i]; //设置哨兵
//需将$temp插入有序增量子表
for ($j = $i - $inc; $j >= 0 && $arr[$j + $inc] < $arr[$j]; $j -= $inc) {
$arr[$j + $inc] = $arr[$j]; //记录后移
}
//插入
$arr[$j + $inc] = $temp;
}
//增量为1时停止循环
}
}
$arr = [2,5,6,10,3,0,1];
shellSort($arr);
print_r($arr);
function shellSort(&$arr) {
$max = count($arr)-1;
$gap = count($arr)-1;
while($gap > 1) {
$gap = $gap/2;
for ($i=0; $i<=$max-$gap; $i++) {
for ($j=$i; $j<=$max-$gap && $arr[$j] > $arr[$j+$gap]; $j+=$gap) {
$temp = $arr[$j];
$arr[$j] = $arr[$j+$gap];
$arr[$j+$gap] = $temp;
}
}
}
}