-
Notifications
You must be signed in to change notification settings - Fork 140
Description
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);
}
}