** 思路:** 将待排序的序列构成一个大顶堆,整个序列的最大值就是堆顶的根节点,将其与数组末尾元素交换,此时末尾元素就是最大的值,然后将剩余的n-1个序列重新构造成一个堆,这样就会得到n个元素中的次小值,如此反复执行,就能得到一个有序序列了
复杂度: O(nlogn)
<?php
function heapAdjust(&$list, $s, $m){
$node = $list[$s];
for($i = 2 * $s; $i < $m; $i *= 2){
if($i < $m && $list[$i] < $list[$i + 1]){
$i++;
}
if($node >= $list[$i]){
break;
}
$list[$s] = $list[$i];
$s = $i;
}
$list[$s] = $node;
}
function heapSort($list){
for($i = intval(count($list) / 2); $i >= 0; $i--){
heapAdjust($list, $i, count($list));
}
for($i = count($list) - 1; $i > 0; $i--){
$list[$i] ^= $list[0];
$list[0] ^= $list[$i];
$list[$i] ^= $list[0];
heapAdjust($list, 0, $i-1);
}
return $list;
}