function heapSort(&$arr) { // 添加头元素 array_unshift($arr, 0); $len = count($arr) - 1; // 初始化堆 for ($i = floor($len / 2); $i > 0; $i--) { heapAdjust($arr, $i, $len); } for ($i = $len; $i > 0; $i--) { swap($arr[1], $arr[$i]); heapAdjust($arr, 1, $i - 1); } // 删除头元素 array_shift($arr); }
function heapAdjust(array &$list, $i, $num) { if ($i > $num / 2) { return; } $key = $i; $leftChild = $i * 2 + 1; $rightChild = $i * 2 + 2; if ($leftChild < $num && $list[$leftChild] > $list[$key]) { $key = $leftChild; } if ($rightChild < $num && $list[$rightChild] > $list[$key]) { $key = $rightChild; } if ($key != $i) { $val = $list[$i]; $list[$i] = $list[$key]; $list[$key] = $val; heapAdjust($list, $key, $num); // heapPrint($list); } }