堆排序:通过形成大顶堆来实现排序。
思路:两层循环,内循环,将最大元素循环调整堆顶,外循环,将堆顶元素弹出,插入到新数组,难点在内循环,定位到最后一个非叶子节点(通过右位移方法),设为标志位,比较该节点与子节点的大小,小于子节点就更换位置,递减标志位,遍历所有非叶子节点,使最大元素换到堆顶位置
$arr = array(3,9,4,1,7,10,8,5,2,6);
/**
* [loopin description]调整为大顶堆,
* @param [array] $array [description]
* @param [int] $num [description]
* @return [type] [description]
*/
function loopin(&$array,$num){
$max = $num;
if(isset($array[2*$num+1]) && $array[$max]<$array[2*$num+1]){
$max = 2*$num+1;
}
if(isset($array[2*$num+2]) && $array[$max]<$array[2*$num+2]){
$max = 2*$num+2;
}
if($max != $num){
$temp = $array[$max];
$array[$max] = $array[$num];
$array[$num] = $temp;
}
$num--;
if($num>=0){
loopin($array,$num);
}
}
/**
* [loopout description]循环弹出堆顶元素,插入新数组,对剩余数组重新整理成大顶堆
* @param [array] $array [description]
* @return [array] [description]
*/
function loopout(&$array){
$res = array();
$length = count($array);
for($i=0;$i<$length;$i++){
$index = count($array)>>1 - 1;
loopin($array,$index);
array_push($res,array_shift($array));
}
return $res;
}
print_r(loopout($arr));