1. 程式人生 > >什麼是堆Heap,最大堆,最小堆

什麼是堆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);
?>