Quicksort

Ob ich mit Quicksort während meiner Ausbildung jemals direkt Bekanntschaft geschlossen habe, ist mir nicht mehr erinnerlich, in der Praxis reichte mir jedenfalls immer Bubblesort.

Rückblickend ist es nicht verwunderlich, dass das Sortieren mittels Bubblesort in VBA stets zufriedenstellend ablief. Offensichtlich deswegen, weil immer nur kleine Auflistungen vorkamen, was nie zeitkritisch war.
Dann aber kam ein Array mit zehntausenden Elementen, das Stunden dafür abverlangte. Insbesondere deswegen, weil nach bis zu 3 Kriterien sortiert werden konnte, der Algorithmus somit auch entsprechend oft aufgerufen wurde!

Nicht wissend, ob denn Quicksort die für meine Bedürfnisse beste Methode sei, wurde Google bemüht. Über Sortieralgorithmen findet sich überraschend viel, wahrscheinlich das tägliche Brot vieler “Listenverarbeiter”. Die vertiefte Suche ergab, dass Quicksort als der schnellste Sortieralgorithmus in der Praxis gilt!

Leider konnte ich keine fertige Lösung finden, die alle meine Anforderungen erfüllte:

  • Eine Benutzerdefinierte Funktion für das Tabellenblatt, die auch vom VBA-Code aufgerufen werden kann
  • Eine rekursive Prozedur, die direkt von VBA-Code aufgerufen werden kann
  • Ausgabe der Ergebnisse in Abhängigkeit vom Aufrufer, d. h. Ausgabe in Spalte oder Zeile eines Tabellenblattes bzw. Zeilenvektor für VBA

Für die Umsetzung nahm ich Anleihen bei Microsoft und Online-Excel.

Die Benutzerdefinierte Funktion QUICKSORT(Matrix;[Absteigend = FALSCH]) erwartet eine einspaltige oder einzeilige Matrix, die gemäß der optionalen Sortierreihenfolge sortiert wird. Fehlt diese, dann wird aufsteigend sortiert. Wahrheitswerte werden numerisch verarbeitet, wobei WAHR (= 1) als True (= -1) einsortiert wird! Die Funktion muss als Matrixformel (Arrayformel) eingegeben werden.
In VBA kann die von QUICKSORT rekursiv aufgerufene Prozedur QUICKSORT4VBA(Matrix;[Absteigend = FALSCH]) direkt benutzt werden.

Die folgende Datei zeigt neben Quicksort auch noch die Möglichkeit, numerische Werte mittels der Funktionen KLLEINSTE und KGRÖSSTE zu sortieren: