Geschrieben von: Stefan Gründhammer
Kategorie: ASP Tricks
This printed page brought to you by AlphaSierraPapa
In diesem Artikel werden Sie lernen Elemente in einem eindimensionalen Array zu sortieren, da dies hin und wieder von großen Nutzem ist. Da VBScript keine passende Funktion und auch keine Sortierbefehle zur Verfügung stellt, müssen wir auf das gute alte Selberprogrammieren zurückgreifen. Ich werde Ihnen zwei bekannte Sortieralgorithmen vorstellen. Wir werden Beispiele mit dem sehr weit verbreiteten Bubble-Sort-Algorithmus und einem älteren, aber dennoch sehr schnellen Alogorithmus, dem Quick-Sort-Algorithmus ausprogrammieren und besprechen.
Jeder fortgeschrittene ASP-Programmierer sollte sich mit Arrays auskennen, ich setze also voraus, daß Sie bereits einmal ein Array dimensioniert haben und auch wissen was ReDim und das Zauberwort Preserve bewirken. Infos zu dynamischen Arrays finden Sie im Artikel Dynamische Arrays - Fluch und Segen.
Ich werde mich in diesem Artikel auf eindimensionale Arrays konzentrieren, da diese ausreichen, um die Algorithmen der Sortierung zu beschreiben. Natürlich geht das Sortieren auch mit mehrdimensionalen Arrays.
Nehmen wir folgende Problemstellung an: Sie haben 500 unsortierte Zahlen in einem Array und wollen eine Ordnung dieses Haufens. Wie machen Sie das am schnellsten und elegantesten? Wenn Sie ein Array mit 500 Einträgen händisch sortieren müßten, würden Sie sicher einige Stunden damit verbringen. Deshalb wäre es doch toll ein kleines Programmlein zu haben, das uns die Arbeit abnimmt und noch dazu die Arbeit in Sekundenbruchteilen erledigt.
Es gibt bestimmt hunderte Sortieralgorithmen, aber nur wenige die sich so gut zum einfachen und schnellen Sortieren von Arrays eignen wie Bubblesort und Quicksort. Oft ist es schneller, einfache Algorithmen zu nutzen als sich mit komplexen Mehrzweckverfahren herumzuschlagen. In der Regel benötigen einfache Sortieralgorithmen ungefähr N² Schritte zum Sortieren von N zufällig angeordneten Elementen. Wenn die Menge der Elemente hinreichend klein ist und die Elemente nicht zufällig angeordnet sind, sortieren einige der einfachen Sortierverfahren schneller als die komplizierten.
Einer der bekanntesten und einfachsten Algorithmen ist der Bubblesort-Algorithmus, er wird in nahezu jedem einführenden Programmierkurs lang und breit diskutiert. Dieser Algorithmus durchläuft das zu sortierende Array, wobei immer zwei benachbarte Elemente miteinander verglichen und wenn nötig auch ausgetauscht. Sortiert ist das Array dann, wenn kein Vertauschen zweier benachbarter Elemente im Array mehr nötig ist.
Ich habe zur Demonstration dieses Verfahrens ein kurzes Script (bubblesort_1.asp), welches Sie sich mittels Link am Ende dieses Artikels downloaden können, geschrieben, in dem Sie z.B. einen String sortieren lassen können, in dem die Elemente durch Leerzeichen voneinander getrennt sind (Sie können das Trennzeichen natürlich auch abändern und an Ihr Script anpassen).
... 6: function bubblesort(arrSortieren) 7: for i = 0 to ubound(arrSortieren) 8: for j = i + 1 to ubound(arrSortieren) 9: if arrSortieren(i) > arrSortieren(j) then 10: arrTemp = arrSortieren(i) 11: arrSortieren(i) = arrSortieren(j) 12: arrSortieren(j) = arrTemp 13: end if 14: next 15: next 16: bubblesort = arrSortieren 17: end function ... 44: arrSort = bubblesort(arrTest) 45: 46: for x = 0 to ubound(arrSort) 47: response.write "arrSort" & "("& x & ") enthält " & x & "<br>" 48: next
In Zeile 44 wird die Funktion bubblesort aufgerufen. In der Funktion bubblesort wird das Array arrSortieren initialisiert. In Zeile 7 beginne ich eine For...Next-Schleife, welche von 0 bis zu UBound(arrSortieren) läuft. Geschlossen wird diese Schleife in Zeile 15. Innerhalb der ersten Schleife befindet sich noch eine zweite For...Next-Schleife (von Zeile 8 bis 14) in der ich der Variable j den Wert i+1 zugewiesen habe, in den Zeilen 9 bis 13 kommt es zum Vergleichen der einzelnen Einträge auf Größe und zum Sortieren der Einträge gegeneinander. Mit arrTemp führe ich eine temporäre Hilfsvariable ein, welche ich zum Zwischenspeichern von Werten während des Vertauschens zweier Werte des Arrays brauche.
Wir durchlaufen das Array von ersten bis zum (n-1)-ten Element. Wenn der Wert von Array(i+1) kleiner ist als der Wert von Array(i), dann wird Array(i) mit Array(i+1) vertauscht. Um das Array sicher sortieren zu können müssen wir diese Vergleiche (n-1) mal durchlaufen.
Das Gute am Datentyp Variant (von VBScript verwendet) ist, daß man ohne Probleme Daten jedes beliebigen Typs, Währungen, Zeichenketten etc. aufsteigend oder absteigend ordnen kann.
Die Laufzeit des Bubblesort Verfahrens kann man hinreichend genau mit N² bestimmen.
Nun möchte ich den nächsten Algorithmus, der in seiner Gewschwindigkeit nicht zu unterschätzen ist, erläutern.
Dieser Algorithmus beruht auf dem Prinzip "Teile und Herrsche" und funktioniert wie folgt: Man teile die Datei bzw. das Array in zwei Teile und sortiere diese unabhänging voneinander und dann werden beide Teile wieder zusammengefügt. Etwas genauer sollte man sich das Sortieren als halbieren der Hälften vorstellen und zwar solange bis nur mehr zwei Teile sind dann dann vertauscht werden können.
Speichern Sie nun die Datei quicksort.asp auf Ihrer Maschine ab und starten Sie es. Die Fehlerbehandlung dieses Script ist nicht sehr aufwendig gestalltet, sollte aber zur Erklärung dieses Beispiels ausreichen.
... 4: Sub quicksort(mitt, anfang, ende) 5: Dim hilf, obenTau, untenTau, temp 6: 7: if ende - anfang = 1 And mitt(anfang) > mitt(ende) Then 8: temp=mitt(anfang) 9: mitt(anfang) = mitt(ende) 10: mitt(ende) = temp 11: End If 12: 13: ' Mehr als 3 Elemente muessen sortiert werden 14: hilf = mitt(int((anfang + ende) / 2)) 15: mitt(int((anfang + ende) / 2)) = mitt(anfang) 16: mitt(anfang) = hilf 17: obenTau = anfang + 1 18: untenTau = ende 19: 20: do 21: 'Finden von obenTau 22: while obenTau < untenTau and mitt(obenTau) <= hilf 23: obenTau = obenTau + 1 24: wend 25: 26: 'Finden von untenTau 27: while mitt(untenTau) > hilf 28: untenTau = untenTau - 1 29: wend 30: 'Vertausche die Werte wenn obenTau kleiner als untenTau 31: if obenTau < untenTau then 32: temp = mitt(obenTau) 33: mitt(obenTau) = mitt(untenTau) 34: mitt(untenTau) = temp 35: End If 36: loop while obenTau < untenTau 37: 38: mitt(anfang) = mitt(untenTau) 39: mitt(untenTau) = hilf 40: 'Aufruf der Sub rekursiv 41: 'Sind zwei oder mehr Elemente in der ersten Teilmenge 42: if anfang < (untenTau - 1) then 43: Call quicksort(mitt,anfang,untenTau-1) 44: end if 45: 46: 'Sind zwei oder mehr Elemente in der zweiten Teilmenge 47: if untenTau + 1 < ende then 48: Call quicksort(mitt,untenTau+1,ende) 49: end if 50: End Sub ...
In Zeile 4 beginnt der eigentliche Algorithmus und reicht mit einigen kleinen Ausnahmen bis Zeile 50. In den Zeilen 46 bis 51 vertausche ich die Werte der Variablen anfang und ende wenn ende kleiner als anfang ist, um die aufsteigende Sortierung gewährleisten zu können. Die selbe Prozedur geschieht in den Zeilen 13 bis 18 bei drei oder mehr Elementen. Das eigentliche Sortieren geschieht in den Zeile 20 bis 36 mittels do..loop-Schleife und einer darin verschachtelten If-Schleife.
Und das Schöne an diesem Algorithmus ist in den Zeilen 42 bis 49, das rekursive Aufrufen der einzelnen Teilprozeduren bis das Array sortiert ist.
Im nächsten Codeblock werden eigentlich nur die Ausgaben und Erzeugung der Zufallzahlen besprochen, die nähere Erklärung folgt unterhalb.
... 52: 'Anzeigen des Arrays 53: Sub ZeigeArray(mitt,lo,hi) 54: Dim i 55: For i = lo to hi 56: Response.Write mitt(i) & "<br>" 57: Next 58: End Sub ... 109: Randomize 110: sAnzahl = Anzahl-1 111: reDim Arr(sAnzahl) 112: For z = 0 to sAnzahl 113: Arr(z) = int(Rnd*100) 114: If (Rnd < 0.5) then 115: Arr(z) = Arr(z)-100 116: end if 117: Next 118: 119: Response.Write "<h2>Hier ist Ihr unsortiertes Array</h2>" 120: Call ZeigeArray(Arr,0,sAnzahl) 121: 122: Call quicksort(Arr,0,sAnzahl) 123: 124: Response.Write "<h2>Jetzt ist es mit dem " & _ 125: "Quicksort-Algorithmus sortiert worden!</h2>" 126: Call ZeigeArray(Arr,0,sAnzahl) ...
Das Anzeigen des Arrays erfolgt in von Zeile 53 bis 58. Dieser Block ist für die Ausgabe des sortierten und auch des unsortierten Arrays (zur Arbeitserleichterung) zuständig. Die Prozedur wird in den Zeilen 120 und 126 zur Ausgabe des Arrays aufgerufen.
Die Zufallszahlen, mit welche das Array in diesem Beispiel befüllt wird, generiere ich in den Zeilen 109 bis 117, wobei ich, um eine größere Vielfalt an Zahlen zu erreichen, auch negative Zahlen erzeuge.
Wenn man es genau nimmt sieht man eigentlich nur die Arbeit, welche in den Zeilen 119 bis 126 ausgeführt wird. Die Verwendung des Quicksort-Algorithmus verlangt schon um einiges mehr Aufwand vom Programmierer als der Bubblesort Algorithmus.
Dadurch, daß VBScript keine eigene Funktion und auch keinen Befehl für die Sortierung bereitstellt, müssen wir uns selber helfen. Sie haben in diesem Artikel gelernt wie man ein ein-dimensionales Array sortiert. Dabei habe ich Ihnen anhand zweier Sortieralgorithmen gezeigt, wie man Arryas mit verschiedenen Datentypen sortiert.
Die einfachere Version der Sortierung ist zweifelsohne der Bubblesort-Algorithmus. Er ist leicht und schnell auf Ihre Aufgabe angepasst und führt Sortierungen von kleinen Arrays hinreichend schnell aus. Sollten Sie allerdings große Arrays sortieren müssen, und das noch dazu mehrere Male, dann empfehle ich Ihnen, sich etwas Arbeit anzutun und die Sortierung mit Quicksort durchzuführen. Noch viel Spaß beim Sortieren.
This printed page brought to you by AlphaSierraPapa
Klicken Sie hier, um den Download zu starten.
http://www.aspheute.com/code/20000906.zip
Am Server installierte Schriftarten auslesen
http:/www.aspheute.com/artikel/20010126.htm
Arrayfunktionen
http:/www.aspheute.com/artikel/20001002.htm
Das Array, unendliche Weiten?
http:/www.aspheute.com/artikel/20000927.htm
Dynamische Arrays - Fluch und Segen
http:/www.aspheute.com/artikel/19990807.htm
©2000-2006 AspHeute.com
Alle Rechte vorbehalten. Der Inhalt dieser Seiten ist urheberrechtlich geschützt.
Eine Übernahme von Texten (auch nur auszugsweise) oder Graphiken bedarf unserer schriftlichen Zustimmung.