Нужна помощь с моей кучей - PullRequest
2 голосов
/ 23 июня 2009

Я застрял с кучей сортировки здесь в 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);
    ?>

Я не могу отсортировать массив, есть идеи, что случилось?

Ответы [ 3 ]

2 голосов
/ 23 июня 2009

siftDown () используется для изменения массива, который вы передаете. Поэтому вы должны передать его по ссылке. В противном случае функция будет работать с копией данных.

function siftDown(<b>&</b>$a, $start, $end) {
1 голос
/ 08 июня 2011

Я думаю, что это самый простой код для Сортировка кучи в php

0 голосов
/ 23 июня 2009

Я не эксперт по PHP, но не похоже, что heapify сделано правильно - как можно свести кучи кучу обращений к siftDown ...? Последний написан, предполагая, что он имеет дело с массивом, который является кучей (возможно, с одним исключением), в то время как heapify - это то, что устанавливает инварианты кучи в первую очередь ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...