Pregunta

Estoy atascado con mi montón aquí en php:

<?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);
    ?>

No puedo ordenar la matriz, ¿alguna idea de lo que está mal?

¿Fue útil?

Solución

Se supone que

siftDown () altera la matriz que pasa. Por lo tanto, debe pasarla por referencia. De lo contrario, la función operará en una copia de los datos.

function siftDown(&$a, $start, $end) {

Otros consejos

Creo que este es el código más simple para montón Ordenar en php

No soy un experto en PHP, pero no parece que heapify esté bien hecho. ¿Cómo puede la heapificación reducirse a un montón de llamadas a siftDown ...? El último se escribe asumiendo que se trata de una matriz que ES un montón (posiblemente con una excepción), mientras que heapify es lo que establece los invariantes del montón en primer lugar ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top