//希尔排序,是插入排序的优化版
function shell($arr)
{
$n = count($arr);
if ($n < 2) return $arr;
//获取间隔,取半,最后一次间隔为1,实现全部数据排序,每次都是直接插入排序
for ($gap=floor($n/2);$gap>0;$gap=floor($gap/2)) {
for ($i = $gap;$i < $n;$i++) {
$tmp = $arr[$i];
$j = $i-$gap;
while ($j>-1 && $arr[$j]>$tmp) {
$arr[$j+$gap] = $arr[$j];
$j-=$gap;
}
$arr[$j+$gap] = $tmp;
}
}
return $arr;
}
$arr = [9,7,4,3,6,8,5,2,1,10];
$res = shell($arr);
print_r($res);