什麼是堆Heap,最大堆,最小堆
堆:完全二叉樹
最大堆(大頂堆):當前節點value>=子節點;
最小堆(小頂堆):當前節點value<=子節點;
最大堆的實現:怎麼將堆調整為最大堆,
<?php
function swap(&$arr, $a, $b) {
$temp = $arr[$a];
$arr[$a] = $arr[$b];
$arr[$b] = $temp;
}
function adjustNode(&$arr,$node, $end) {
$lchild = 2*$node + 1;
$rchild = 2*$node + 2;
$max = $node;
if($lchild <= $end && $arr[$lchild] > $arr[$node]) {
$max = $lchild;
}
if($rchild <=$end && $arr[$rchild]>$arr[$max]) {
$max = $rchild;
}
if($max != $node) {
swap($arr, $node, $max);
adjustNode($arr, $max, $end);
}
}
function BuildHeap(&$arr) {
$p = floor(count($arr)/2) -1;
for($i=$p;$i>=0;$i--) {
adjustNode($arr,$i,count($arr)-1);
}
}
function HeapSort(&$arr) {
BuildHeap($arr);
$n = count($arr)-1;
for($i=$n;$i>0;$i--) {
swap($arr,$i,0);
adjustNode($arr, 0,$i-1);
}
}
$arr = array(90,1,5,-8,3,7,4,6,2,-3,2);
HeapSort($arr);
var_dump($arr);
?>