Ergebnis 1 bis 3 von 3

Thema: Qsort-Optimierung, Ideensammlung

  1. #1
    Diese Posts stammen ursprünglich aus einem OT-Thread, der im Moderator-Interna zu finden ist.

    EDIT: Wurscht, ich mach einfach nen normalen Introsort draus. :»

    Mal ne kleine Diskussion am Rande, an die Aloritmen-Guys hier, sprich: Fyx, Monkey, und wer sich eben noch so angesprochen fühlt.

    Ich mag nen brauchbaren Qsort implementieren. Den Pivot wähle ich als den Mittleren dreier zufälliger Listeneinträge.

    Das Verfahren skaliert für große Werte ausgezeichnet. Wenn meine Partition allerdings bereits sehr klein ist, wird es natürlich immer wahrscheinlicher, dass sich meine zufälligen Zahlen überschneiden. Die Wahrscheinlichkeit wird durch die Konkruenzen einfach zu hoch, als das ich davon ausgehen kann, dass ich da nicht zu viele Zufallszahlen generieren muss, bis eine passt.

    Die Geschichte sowie die Minimalanzahl für eine Partition von drei Elementen ist insofern natürlich sowieso nicht tragisch, weil ein qsort für so kleine Listen sowieso schlecht skaliert, und ich auf ein anderes Sortierverfahren zurückgreifen muss.

    Die eigentiche Frage: Weiß einer von euch was für ein Verfahren als zweites Sortierverfahren ab welcher Größe brauchbar wäre? Für Vorschläge die ich in meinen Tests und Überlegungen weiter berücksichtigen kann wäre ich dankbar.

    Aufwand für Schlüsselvergleiche und Bewegungskosten sind beide für den general purpose-Fall, wobei wir meistens wahrscheinlich eher nur Referenzen verschieben.


    Insofern die Rekursionstiefe gegen das Maximum geht, weiche ich natürlich auf einen anderen Algo (heapsort) aus.

  2. #2
    Bei uns an der Uni ist für Listen mit 6 oder weniger Elementen in der Regel Insertion Sort üblich. Der scheint da wohl ganz brauchbar zu funktionieren, auch wenn er für größere Eingaben natürlich grausam skaliert.

    Einen Tipp noch, um den Speicherbedarf beim Quick Sort ein wenig zu verringern: sortier nur die kleinere Partition rekursiv. Für die größere kannst du in der Inplace Variante von QSort (ich nehme an, die verwendest du) Start- bzw. End-Index neu setzen und iterativ arbeiten.

    Edit: wäre vielleicht ganz nett, die zwei Posts hier in einen extra Thread im Programmierforum zu schieben, das interessiert sicher auch andere.

  3. #3
    Zitat Zitat von DFYX Beitrag anzeigen
    Bei uns an der Uni ist für Listen mit 6 oder weniger Elementen in der Regel Insertion Sort üblich. Der scheint da wohl ganz brauchbar zu funktionieren, auch wenn er für größere Eingaben natürlich grausam skaliert.
    Insertion ist auch das, was ich aktuell verwende, nur kommt mir das doch etwas ungut vor. Ich überlege mir da noch mit einem Heap anzusetzen und zu vergleichen. Gerade dieses unschöne Quadrat soll aus der Laufzeit heraus. Mal schauen, wie das für beliebige Permutationen der entsprechenden Längen aussieht.

    Bevor ich das allerdings mache, muss ich erst herausfinden, wie der Compiler Generics genau auflöst, um die Datenverschiebungen besser einschätzen zu können.

    Zitat Zitat von DFYX Beitrag anzeigen
    Einen Tipp noch, um den Speicherbedarf beim Quick Sort ein wenig zu verringern: sortier nur die kleinere Partition rekursiv. Für die größere kannst du in der Inplace Variante von QSort (ich nehme an, die verwendest du) Start- bzw. End-Index neu setzen und iterativ arbeiten.
    Mache ich bereits - ich frage mich generell, warum man so wenig von diesem Trick liest, wenn man herum sucht.


    Zitat Zitat von DFYX Beitrag anzeigen
    Edit: wäre vielleicht ganz nett, die zwei Posts hier in einen extra Thread im Programmierforum zu schieben, das interessiert sicher auch andere.
    Kannst du gerne machen, wenn du magst.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •