- 将数组中数据依次按照增量序列{n/2,(n/2)/2…1}分组
- 将每次按照增量分组的数组插入排序
- 重复直到增量为1
例:$arr = [8,9,1,7,2,3,4,5,6,0]
第一次分组增量为gap = length/2=10/2=5,则将数组分成5组 [
arr[5]],[
arr[6]],[
arr[7]],[
arr[8]],[
arr[9]],对这五组数据分别进行插入排序
第二次分组增量为gap = gap/2=5/2=2,将数组分成两组,每组五个数据[
arr[2],
arr[6],
arr[1],
arr[5],
arr[9]],对这两组数据分别进行插入排序
第三次分组增量为 gap=gap/2=2/2=1,对前面排完序后的[
arr[1],
arr[3],
arr[5],
arr[7],
arr[9]]进行插入排序
<?php
function shellSort($arr) {
$len = count($arr);
for ($gap = floor($len/2);$gap > 0; $gap = floor($gap / 2)) {
for ($i = $gap; $i < $len; $i++) {
$j = $i;
$current = $arr[$i];
while ($j - $gap >= 0 && $current < $arr[$j - $gap]) {
$arr[$j] = $arr[$j - $gap];
$j = $j - $gap;
}
$arr[$j] = $current;
}
}
return $arr;
}
print_r(shellSort([8,9,1,7,3,5,4,6,0]));