关于最大堆的介绍,网上有丰富的资料,此处不再赘述,只贴出相关代码。
//将以$root 为根的完全二叉树格式化为最大堆
function heapify($arr, $root){
$curData = $arr[$root];
$len = count($arr);
while($root <= $len/2) {
$max = $left = $root*2;
$right = $left+1;
if($left < $len && $arr[$left] < $arr[$right]) {
$max = $right;
}
if($curData < $arr[$max]) {
$arr[$root] = $arr[$max];
$root = $max;
}else{
break;
}
}
$arr[$root] = $curData;
return $arr;
}<pre name="code" class="php">
//调用示例:
$arr = [1=>15, 36, 17, 28, 46, 68, 29];
$len = count($arr);
for($i=floor($len/2); $i>=1; $i--) {
$arr = $this->heapify($arr, $i);
}
//堆排序
function heapSort($arr) {
$len = count($arr);
//确保数组下标从1开始
$arr = array_combine(range(1, $len), $arr);
$arr = $this->formatHeap($arr);
$i = $len;
while($i>0) {
$tmp = $arr[1];
$arr[1] = $arr[$i];
$arr[$i] = $tmp;
$arr = $this->heapify($arr, 1, --$i);
}
return $arr;
}