【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));
相关文章推荐
- 【DAY.2】PHP数据结构与算法_排序_冒泡排序
- 【DAY.6】PHP数据结构与算法_排序_归并排序
- PHP实现排序堆排序(Heap Sort)算法
- 数据结构与算法系列之一:八大排序之堆排序
- 数据结构与算法专题之查找与排序——堆排序、桶排序
- 数据结构与算法总结——排序(二)归并排序,快速排序 和 堆排序
- 数据结构与算法:七种排序算法总结(冒泡排序、选择排序、直接插入排序、希尔排序、堆排序、归并排序、快速排序)
- 【DAY.8】PHP数据结构与算法_排序_希尔排序
- 【DAY.4】PHP数据结构与算法_排序_插入排序
- php数据结构与算法(PHP描述) 快速排序 quick sort
- php数据结构与算法(PHP描述) 快速排序 quick sort
- 【DAY.3】PHP数据结构与算法_排序_选择排序
- 数据结构与算法从零开始系列:冒泡排序、选择排序、插入排序、希尔排序、堆排序、快速排序、归并排序、基数排序
- java数据结构与算法-高级排序-堆排序
- 奇怪的排序 http://acm.nyist.net/JudgeOnline/problem.php?pid=540
- php 对二维数组的某个键的值进行排序
- PHP实现对多维数组按照某个键值排序的两种解决方法
- 几种改良的排序,堆排序,希尔排序,快速排序--堆排序篇(改良的选择排序算法)
- 数据结构排序问题---堆排序及各种排序时间空间复杂度
- php数组排序(二分法)