Quicksort in PHP

  • Hey ho und guten Abend allerseits!

    Ich beschäftige mich im Moment mit dem Thema Quicksort, verstehe auch den Algorithmus, nur bei der Umsetzung hapert es ein wenig.
    Zu meiner bisherigen Erfahrung im Programmieren: Delphi, C++, HTML und nun PHP. Alles eher oberflächlich als tiefgründig :o !
    Hab zwar auch beim durchforsten des Internets einige Quellcodes gefunden, aber so richtig überzeugt bin ich noch nicht.
    Hier mal mein bestes Ergebnis aus dem Internet bezüglich Quicksort in PHP:


    <?php

    $array = array(6,4,2,1,0,7,3,5,8 ) ;

    function quick_sort($array)
    {
    if (count($array) <= 1) return $array;

    $key = $array[0];
    $left_arr = array();
    $right_arr = array();
    for ($i=1; $i<count($array); $i++){
    if ($array[$i] <= $key)
    $left_arr[] = $array[$i];
    else
    $right_arr[] = $array[$i];
    }
    $left_arr = quick_sort($left_arr);
    $right_arr = quick_sort($right_arr);

    return array_merge($left_arr, array($key), $right_arr);
    }

    $sortiert = quick_sort($array);

    foreach($sortiert as $val)
    {
    echo $val . '<br> <br/>';
    }

    ?>

    Es funktioniert zwar, aber so richtig 100% komm ich damit noch nicht klar ... !
    Wäre nett, wenn jemand mal ein paar Minuten für mich Zeit hätte und mir den Quellcode erklären könnte!

    Vielen dank schonmal im Voraus, mfg Zenephret

    Einmal editiert, zuletzt von Zenephret (3. Mai 2010 um 20:32)

  • Die Funktion sortiert ein Array. Aber sie ist überflüssig, denn es gibt eine Schnellere Funktion, die auch funktioniert, wenn String-Keys dabei sind.
    siehe arsort(array $ar);
    [OT] Ach schade, der Doku vorlese-Service fehlt immernoch -.- [/OT]

    Der, der weiß dass er nichts weiß, weiß mehr als der, der nicht weiß, dass er nichts weiß.

    Wer nach etwas fragt, geht grundsätzlich das Risiko ein, es auch zu bekommen!

  • brauchst du eine funktionserklärung, wie quicksort funktioniert?
    oder wie?

    hab dieses jahr in "industrielle informationstechnik" mehrere algorithmen gelernt. könnte dir da sicher was erklären.

    oder versteht ich dich falsch?

    Something big is coming. And there will be pirates and ninjas and unicorns...

  • Also, ich brauch einen Quicksort-Algorithmus in PHP.
    Aber da ich nur wenig Erfahrung in PHP habe, weiß ich nicht, welche Variablen welche Werte haben.
    Bzw. wird mit $key = $array [0] das Pivotelement festgelegt ? Wie kann ich das Pivotelement in die Mitte setzen?
    Ich hab keine Ahnung wofür die einzelnen Variablen stehen. Was wann eine Funktion ist oder nicht z.B. $right_arr = quick_sort(left_arr);
    Wird jetzt der Varibale eine Funktion zugeordnet?
    Hoffe, dass es jetzt verstädnlicher ist
    danke für die schnellen Antworten, thumbs up
    Zene

  • Es gibt zwar bessere Wege, ein Array nach Quicksort zu sortieren, aber um Algorithmik zu lernen ist das akzeptabel.

    Wenn dich das interessiert: Sieh dir Heapsort an :)

    Something big is coming. And there will be pirates and ninjas and unicorns...

  • Immer wieder gerne :)
    Kannst dich gerne wieder melden (vor allem bei Algorithmik <3) ;D

    Something big is coming. And there will be pirates and ninjas and unicorns...

  • Das ist ein bisschen doof, den mit O(n) Extra-Speicher zu implementieren, lieber auf left-array und right-array verzichten und nur Bereiche eines einzigen Arrays betrachten, damit geht das locker mit logarithmischen Speicher.

  • Das ist ein bisschen doof, den mit O(n) Extra-Speicher zu implementieren, lieber auf left-array und right-array verzichten und nur Bereiche eines einzigen Arrays betrachten, damit geht das locker mit logarithmischen Speicher.

    Ich denke, hier geht es darum, Algorithmik zu lernen und nicht darum perfekte Algorithmen zu implementieren.
    Wir haben die Speicherverwaltung auch in der Schule angerissen.
    Aber das einzige, wo es mit Speicher knapp werden könnte, wäre Microprozessor-Programmierung. Und das ist mit PHP nur schwer möglich ;)

    Something big is coming. And there will be pirates and ninjas and unicorns...

  • Quicksort lohnt sich nur bei vielen Elementen, und wenn du ein paar tausend Elemente sortierst, dann ist es ein Unterschied, ob du die alle doppelt im Speicher hast oder nicht.
    Andererseits: Die ganzen Array-Funktionen von PHP sind genauso schrottig, da sollte man nicht erwarten, dass es jemand besser macht, der es gerade erst lernt. Irgendwie sind diese Funktionen so ausgelegt, dass man möglichst ineffizient programmiert. Andererseits möchte man vllt. unabhängig von der Programmiersprache auch mal wissen, wie man einen bestimmten Algorithmus in-place hinbekommt.

    Dann kann man entweder quicksort($array) oder quicksort(&$array) verwenden, je nachdem, ob man die unsortierte Version behalten möchte.

    Hast schon Recht, dass das in der PHP-Praxis egal ist, aber man will ja Algorithmik lernen.

  • un jetzt vergleich die komplexität deines codes mal mit der des anderen ;D (aus der sicht eines anfängers, nicht aus deiner)

    Something big is coming. And there will be pirates and ninjas and unicorns...

  • Komplexität...
    Average Case:
    Meiner: O(n log n) Laufzeit, O(log n) Speicher
    Vorheriger: O(n log n) Laufzeit, O(n) Speicher
    Worst Case:
    Meiner: O(n^2) Laufzeit, O(n) Speicher
    Vorheriger: O(n^2) Laufzeit, O(n^2) Speicher
    ...

  • Naja, ich kann zum Ausgleich einen Kommentar hinzufügen. *g*