您的位置:首页 > 理论基础 > 数据结构算法

【DAY.7】PHP数据结构与算法_排序_堆排序

2016-12-14 17:36 197 查看
堆排序:通过形成大顶堆来实现排序。
思路:两层循环,内循环,将最大元素循环调整堆顶,外循环,将堆顶元素弹出,插入到新数组,难点在内循环,定位到最后一个非叶子节点(通过右位移方法),设为标志位,比较该节点与子节点的大小,小于子节点就更换位置,递减标志位,遍历所有非叶子节点,使最大元素换到堆顶位置

$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));
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  堆排序 php 排序