function siftup(&$seq, $n) {
$i = $n;
while($i > 1) {
$p = floor($i / 2);
if($seq[$p] <= $seq[$i]) {
break;
}
list($seq[$p], $seq[$i]) = array($seq[$i], $seq[$p]);
$i = $p;
}
}
/**
* 向下篩選元素
*/
function siftdown(&$seq, $n) {
$i = 1;
while(1) {
$c = $i * 2;
if($c > $n) {
break;
}
/* $c 爲左結點 $c + 1 爲右結點*/
if($c + 1 <= $n) {
if($seq[$c + 1] < $seq[$c]) {
$c++;
}
}
if($seq[$i] <= $seq[$c]) {
break;
}
/* 將$seq[$i]和它的兩個孩子結點中關鍵字較大者進行交換 */
list($seq[$c], $seq[$i]) = array($seq[$i], $seq[$c]);
$i = $c;
}
}
/**
* 堆排序
* @param array $seq 待排序的序列
*/
function heapSort(&$seq) {
$n = count($seq);
for($i = 2; $i <= $n; $i++) {
siftup($seq, $i);
}
for($i = $n; $i >= 2; $i--) {
list($seq[1], $seq[$i]) = array($seq[$i], $seq[1]);
siftdown($seq, $i - 1);
}
}
/* 測試 */
$seq = array(1 => 9, 7, 2, 3, 1, 6);
heapSort($seq);
print_r($seq);
php-堆排序
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.