Skip to content

buildHeap直接生成即可,严谨的$i =floor($length /2) -1 #19

@shanyishuxing

Description

@shanyishuxing

require_once DIR . '/common.php';

function heapSort(&$arr)
{
$length = count($arr);
$heapSize = $length - 1;
for ($i = floor($length / 2) - 1; $i >=0; $i--) {
heapify($i, $heapSize, $arr);
}
for ($i = $heapSize; $i >= 0; $i--) {
list($arr[0], $arr[$heapSize]) = [$arr[$heapSize], $arr[0]];
$heapSize--;
//再把剩下的元素调整成最大堆 ,-1就是求下一个节点
heapify(0, $heapSize, $arr);
//$heapSize 可以用$i替代, heapify (0, $heapSize, $arr); 可用$i-1 替代
}
return $arr;
}

function heapify(int $k, int $heapSize, array &$arr)
{
$largest = $k;
$left = 2 * $k + 1;
$right = 2 * $k + 2;
if ($left <= $heapSize && $arr[$k] < $arr[$left]) {
//跟左侧节点比,顶点比左侧小,则换
$largest = $left;
}
if ($right <= $heapSize && $arr[$largest] < $arr[$right]) {
//跟右侧节点比,顶点比右侧小,则换
$largest = $right;
}
if ($largest != $k) {
//如果最大点不是顶点,则交互并继续排序
list($arr[$largest], $arr[$k]) = [$arr[$k], $arr[$largest]];
heapify($largest, $heapSize, $arr);
}
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions