堆排序

废话少说,直接看代码

//堆排序
function duiSort($arr) {
 

  for($i=count($arr); $i > 1; $i--) {

    //构建堆

  heapSort($arr, $i);//得到堆顶是最大值,然后下面交换堆顶和堆尾的值; $i表时构建堆的长度在递减,因为交换堆顶和堆尾后就不需要在用堆尾了
  $temp = $arr[0];
  $arr[0] = $arr[$i-1];
  $arr[$i-1]= $temp;
  }
  print_r($arr);
}


//构建堆结构

//$len是构建堆的长度值

function heapSort(&$arr, $len) {
//完全二叉树 父节点的两个子节点 2n+1  2n+2(数组下标0开始)
//找到最小的叶节点左值
$index = intval($len / 2) - 1; //得到最小非叶节点,下标从0开始,所以 - 1
for($index; $index >= 0; $index--) {
$j = $index * 2 + 1;
if(  $j< $len -1  && isset($arr[$j + 1]) && $arr[$j+1] > $arr[$j]) { //叶节点哪个大和父节点做比较
$j++;
}
if($arr[$index] < $arr[$j]) { //父节点小于子节点进行交换值
$temp = $arr[$index];
$arr[$index] = $arr[$j];
$arr[$j] = $temp;
}
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值