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?

War es hilfreich?

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 ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top