希爾排序
希爾排序又稱縮小增量排序,是指將無序序列,按照增量的不同大小,分成若干個序列,然後對子序列進行插入排序,本質上就是插入排序。
思路:
- 我們先確定增量,一般初始增量我們都設置爲數組長度的一半(向下取整);
- 我們根據增量,將數組分成了若干個子序列:
- 分別對這四個子序列進行插入排序:
- 然後再一次遍歷,增量設置爲原先的一半,也就是繼續除以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));
大家那種好理解用那種就可以,如果有更好的思路和代碼歡迎大家進行留言!