堆排序
堆的性质:子节点的值总是小于(或大于)它的父节点的值。
堆排序的平均时间复杂度为Ο(nlogn)。
算法步骤:
1 创建一个堆H[0..n-1];
2 把堆首(最大值)和堆尾互换;
3把堆的尺寸缩小1,并调整堆使其符合堆的性质;
4重复步骤2,直到堆的尺寸为1。
PHP代码实现:
function adjust_heap(&$arr, $start, $end){
$temp = $arr[$start];
$i = $start*2 + 1;
while($i < $end){
if ($i + 1 <= $end && $arr[$i+1] > $arr[$i]){
$i++;
}
if ($arr[$i] <= $temp){
break;
}
$arr[$start] = $arr[$i];
$start = $i;
$i = $start*2 + 1;
}
$arr[$start] = $temp;
}
function heap_sort(&$arr){
$count = count($arr);
for($i=($count/2-1); $i >= 0; $i--){
adjust_heap($arr, $i, $count-1);
}
for($i = $count-1; $i > 0; $i--){
$temp = $arr[$i];
$arr[$i] = $arr[0];
$arr[0] = $temp;
adjust_heap($arr, 0, $i-1);
}
}