堆排序:通过形成大顶堆来实现排序。
思路:两层循环,内循环,将最大元素循环调整堆顶,外循环,将堆顶元素弹出,插入到新数组,难点在内循环,定位到最后一个非叶子节点(通过右位移方法),设为标志位,比较该节点与子节点的大小,小于子节点就更换位置,递减标志位,遍历所有非叶子节点,使最大元素换到堆顶位置
$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));
本文介绍了一种基于大顶堆的排序算法——堆排序,并详细解释了其内部实现机制。通过两层循环,内循环负责调整堆结构以确保最大元素位于堆顶,外循环则将堆顶元素依次弹出并构建有序数组。
1万+

被折叠的 条评论
为什么被折叠?



