- 将数组中数据依次按照增量序列{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组 [
a
r
r
[
0
]
,
arr[0],
arr[0],arr[5]],[
a
r
r
[
1
]
,
arr[1],
arr[1],arr[6]],[
a
r
r
[
2
]
,
arr[2],
arr[2],arr[7]],[
a
r
r
[
3
]
,
arr[3],
arr[3],arr[8]],[
a
r
r
[
4
]
,
arr[4],
arr[4],arr[9]],对这五组数据分别进行插入排序
第二次分组增量为gap = gap/2=5/2=2,将数组分成两组,每组五个数据[
a
r
r
[
0
]
,
arr[0],
arr[0],arr[2],
a
r
r
[
4
]
,
arr[4],
arr[4],arr[6],
a
r
r
[
8
]
]
,
[
arr[8]],[
arr[8]],[arr[1],
a
r
r
[
3
]
,
arr[3],
arr[3],arr[5],
a
r
r
[
7
]
,
arr[7],
arr[7],arr[9]],对这两组数据分别进行插入排序
第三次分组增量为 gap=gap/2=2/2=1,对前面排完序后的[
a
r
r
[
0
]
,
arr[0],
arr[0],arr[1],
a
r
r
[
2
]
,
arr[2],
arr[2],arr[3],
a
r
r
[
4
]
,
arr[4],
arr[4],arr[5],
a
r
r
[
6
]
,
arr[6],
arr[6],arr[7],
a
r
r
[
8
]
,
arr[8],
arr[8],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]));