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

堆排序:通过形成大顶堆来实现排序。
思路:两层循环,内循环,将最大元素循环调整堆顶,外循环,将堆顶元素弹出,插入到新数组,难点在内循环,定位到最后一个非叶子节点(通过右位移方法),设为标志位,比较该节点与子节点的大小,小于子节点就更换位置,递减标志位,遍历所有非叶子节点,使最大元素换到堆顶位置
   
   
  1. $arr = array(3,9,4,1,7,10,8,5,2,6);
  2. /**
  3. * [loopin description]调整为大顶堆,
  4. * @param [array] $array [description]
  5. * @param [int] $num [description]
  6. * @return [type] [description]
  7. */
  8. function loopin(&$array,$num){
  9. $max = $num;
  10. if(isset($array[2*$num+1]) && $array[$max]<$array[2*$num+1]){
  11. $max = 2*$num+1;
  12. }
  13. if(isset($array[2*$num+2]) && $array[$max]<$array[2*$num+2]){
  14. $max = 2*$num+2;
  15. }
  16. if($max != $num){
  17. $temp = $array[$max];
  18. $array[$max] = $array[$num];
  19. $array[$num] = $temp;
  20. }
  21. $num--;
  22. if($num>=0){
  23. loopin($array,$num);
  24. }
  25. }
  26. /**
  27. * [loopout description]循环弹出堆顶元素,插入新数组,对剩余数组重新整理成大顶堆
  28. * @param [array] $array [description]
  29. * @return [array] [description]
  30. */
  31. function loopout(&$array){
  32. $res = array();
  33. $length = count($array);
  34. for($i=0;$i<$length;$i++){
  35. $index = count($array)>>1 - 1;
  36. loopin($array,$index);
  37. array_push($res,array_shift($array));
  38. }
  39. return $res;
  40. }
  41. print_r(loopout($arr));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值