Benötigen Sie mit meinem Haufen sortieren helfen
Frage
Ich bin ein bisschen mit meinem Haufen Art hier in PHP fest:
<?php
function heapSort($a, $count){
$a = heapify($a, $count);
$end = $count - 1;
while ($end > 0){
$temp = $a[$end];
$a[$end] = $a[0] ;
$a[0]= $temp;
$end = $end - 1;
siftDown($a, 0, $end);
}
return $a;
}
function heapify($a,$count){
$start = ($count - 2) / 2;
while ($start >= 0){
$a = siftDown($a, $start, $count-1);
$start = $start - 1;
}
return $a;
}
function siftDown($a, $start, $end){
$root = $start;
while ($root * 2 + 1 <= $end){// While the root has at least one child
$child = $root * 2 + 1; // root*2+1 points to the left child
//If the child has a sibling and the
//child's value is less than its
//sibling's
if ($child + 1 <= $end and $a[$child] < $a[$child + 1])
$child = $child + 1;// then point to the right child instead)
if ($a[$root] < $a[$child]){ // out of max-heap order
list($a[$child],$a[$root]) = array($a[$root],$a[$child]);
$root = $child; // repeat to continue sifting down
// the child now
}
else {
return $a;
}}
return $a;
}
$a = Array(3,1,5,2);
$b = heapSort($a,count($a));
print_r($b);
?>
Ich kann das Array zu sortieren bekommen, eine Ahnung, was falsch ist?
Lösung
siftDown () soll das Array Sie passieren ändern. Deshalb müssen Sie es als Verweis übergeben. Andernfalls wird die Funktion auf einer Kopie der Daten betrieben werden kann.
function siftDown(&$a, $start, $end) {
Andere Tipps
Ich denke, das einfachste Code ist Haufen Sortieren in php
Ich bin kein PHP-Experte, aber es scheint nicht, wie heapify
richtig gemacht wird - wie kann heapification zu einem Bündel von Anrufen zu siftDown einkochen ...? Letztere geschrieben wird vorausgesetzt, es ist mit einem Array handelt, die einen Haufen IS (mit vielleicht einer Ausnahme), während heapify
ist, was die Haufen Invarianten in erster Linie stellt ...