版權聲明:本文爲博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/phpbook/article/details/53768576
希爾排序:基於插入排序基礎上分治後的排序方法,將數組按照一定間隔分成若干組,分別進行插入排序,最後組合成一個總的分組,再進行一次插入排序,優點在於減少交換次數(不是每次都循環整個數組)。
$arr = array(3,9,4,1,7,10,12,321,8,5,2,6);
/**
* [shellsort 希爾排序]
* @param [type] $array [待排序數組]
* @return [type] array [排序完成後數組]
* 關鍵變量$m(組數,步長),$key(每組元素數量)
*/
function shellsort($array){
//初始獲取數組長度$len,初始化$m,下面第次除2分組
$len = $m = count($array);
//最外層循環,每次對數組進行分組,直至只剩一個數組
while($m>=2){
//獲取當前組數
$m = floor($m/2);
//獲取當前組內元素個數
$key = floor($len/$m);
//循環對每組元素進行插入排序
for($i=0;$i<$m;$i++){
//對$i 組進行插入排序,$key個元素,關鍵點步長$m,插入排序不是按1,遞加,而是按照步長$m遞加
for($j=1;$j<$key;$j++){
$temp = $array[$i+$m*$j];
for($k=$j;$k>0;$k--){
if($temp>$array[$i+$m*($k-1)]){
$array[$i+$m*$k] = $array[$i+$m*($k-1)];
}else{
break;
}
}
$array[$i+$m*($k)] = $temp;
}
}
}
return $array;
}
print_r(shellsort($arr));