/*
1、间隔为4,每间隔4个人,这些人排成一组
2、在每一组的组内进行排序,数组交换,比大小
3、重新设置间隔分组,例如 黄色一组 ,黑色一组 、在进行组内排序交换(用的是插入法)
重点、分组的间隔都会越来越小,最后变成1,如果变成1的时候,说明已变成了一组
排序用的是插入排序
分组间隔不停的减少,不停的分组,不停做组内的排序最终变为1为止
*/
数据的增量 gap = length/2 =4
在缩小增量 gap = gap / 2 =2
这样以此类推
gap = d = 9/2=4
可以分成4组 ,间隔为4,每间隔4个人,这些人排成一组
每组在插入排序,变成下面的
在重新分组 gap = d = gap / 2 =2
每组在进行插入排序
<?php
/**
* 希尔排序
* 随便找一个数认为是最小的
*/
function shell_sort(array $arr){
// 将$arr按升序排列
$len = count($arr);
$f = 3;// 定义因子
$h = 1;// 最小为1
//间隔 为4呀
while ($h < intval($len/$f)){
$h = $f*$h + 1; // 1, 4, 13, 40, 121, 364, 1093, ...
}
# $h = intval($len/$f);
while ($h >= 1){ // 将数组变为h有序
echo '<br>'.'h:'.$h.'<br>'.'<br>';
for ($i = $h; $i < $len; $i++){ // 将a[i]插入到a[i-h], a[i-2*h], a[i-3*h]... 之中 (算法的关键
echo 'i:'.$i.'<br>';
#如果想插入的数和比较的数小,就插入前面
for ($j = $i; $j >= $h && $arr[$j] < $arr[$j-$h]; $j -= $h){
# 箭头往前移动 $j -= $h 原来是 $j -=1 下标
echo 'j:' .$j.'<br>';
echo 'h:' .$h.'<br>';
echo 'arr:' .$arr[$j-$h].'<br>';
#这部是交换
$temp = $arr[$j];
$arr[$j] = $arr[$j-$h];
$arr[$j-$h] = $temp;
dump($arr);
}
}
$h = intval($h/$f);
}
return $arr;
}
$arr = array(14, 9, 1, 4, 6, -3, 2, 99, 13, 20, 17, 15, 3);
dump($arr);
$shell = shell_sort($arr);
echo '<pre>';
print_r($shell);
function dump($arr)
{
foreach ($arr as $value) {
echo $value.' ';
}
echo '<br>';
}
Array
(
[0] => -3
[1] => 1
[2] => 2
[3] => 3
[4] => 4
[5] => 6
[6] => 9
[7] => 13
[8] => 14
[9] => 15
[10] => 17
[11] => 20
[12] => 99
)
PHP中希尔排序详解
PHP实现排序算法----希尔排序(Shell Sort)
希尔排序算法的php实现
php实现希尔排序