希尔排序:基于插入排序基础上分治后的排序方法,将数组按照一定间隔分成若干组,分别进行插入排序,最后组合成一个总的分组,再进行一次插入排序,优点在于减少交换次数(不是每次都循环整个数组)。
$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));