希尔排序
希尔排序又称缩小增量排序,是指将无序序列,按照增量的不同大小,分成若干个序列,然后对子序列进行插入排序,本质上就是插入排序。
思路:
- 我们先确定增量,一般初始增量我们都设置为数组长度的一半(向下取整);
- 我们根据增量,将数组分成了若干个子序列:
- 分别对这四个子序列进行插入排序:
- 然后再一次遍历,增量设置为原先的一半,也就是继续除以2(向下取整),得出的序列:
- 分别对这两个序列进行插入排序,结果为:
- 再将增量除以2得到新增量为1,便可以立即进行插入排序:
- 得到的结果就是有序数组,就在也无需进行排序了:1,2,3,4,5,6,7,9,10
下面的代码是我按照思路,一步一步写出来的,应该较好理解:
function shellSort($arr){
$length = count($arr);
//增量初始化;
$plus = floor($length/2);
while($plus>0){
for($i = 1;$i <= $plus;$i++){ //有几个子序列
for($j = $plus;$j<$length/$plus;$j+=$plus){
$tmp = $arr[$j];
for($k = $j-$plus;$k>=0;$k-=$plus){
if($tmp < $arr[$k]){
$arr[$k+$plus] = $arr[$k];
$arr[$k] = $tmp;
}
}
}
}
$plus = floor($plus/2);
}
return $arr;
}
$arr = array(6,2,4,3,5,7,9,1,10);
print_r(shellSort($arr));
这下面是根据网上大神的代码,然后对自己的代码进行优化后的,进一步思考后也应该可以理解:
function shellSort($arr) {
$length = count($arr);
//增量初始化;
$plus = $length;
while ($plus > 0) {
for ($i = $plus; $i < $length; $i++) {
$tmp = $arr[$i];
for ($j = $i - $plus; $j >= 0; $j -= $plus) {
if ($tmp < $arr[$j]) {
$arr[$j + $plus] = $arr[$j];
$arr[$j] = $tmp;
}
}
}
$plus = floor($plus / 2);
}
return $arr;
}
$arr = array(6,2,4,3,5,7,9,1,10);
print_r(shellSort($arr));
大家那种好理解用那种就可以,如果有更好的思路和代码欢迎大家进行留言!