Dieser Artikel soll einen kleinen Einblick in die Programmierung von Sortierverfahren unter Microsoft Visual Basic geben (Theorie und praktische Anwendung). Aufgabe 1: Planung des Projektes Natürlich sollte man die Programmierung in mehreren Stufen vollziehen:
Aufgabe 2: Überlegung und Programmierung Teil A Der Zugriff auf das VB-Listensteuerelement Listbox ist im Allgemeinen einfach. Folgende Befehle und Eigenschaften sind für die Programmierung des Sortierprogramms erforderlich/nützlich: Funktionen: Objekt.AddItem(Item as String, [Index]) Fügt ein Element der Liste hinzu Objekt.RemoveItem(Index as Integer) Löscht ein Element aus der Liste Objekt.Clear Löscht den Inhalt der gesamten Liste Eigenschaften: Objekt.List(Integer) as String Gibt den Text des markierten Listenelementes zurück Objekt.Text as String Gibt auch den Text des markierten Listenelementes zurück
Teil B Die Liste kann mit dem Bubble-Sortierverfahren sortiert werden. Dies ist das schlechteste aber einfachste Sortierverfahren. Es funktioniert wie folgt:Immer zwei in der Liste aneinander liegende Elemente werden verglichen. Je nach Sortierkriterium werden die Einträge dann vertauscht oder nicht. Hier ein VB-Quellcode-Beispiel zum Vertauschen der Inhalte zweier Variablen: Entry1 ist Listeneintrag 1 und Entry2 Listeneintrag 2. Dim Buffera as String Buffera = Entry1 Entry1 = Entry2 Entry2 = Buffera Der Puffer (Buffer) ist unbedingt erforderlich, da sonst der Inhalt des ersten Listeneintrags verloren gehen würde. Dies geht natürlich auch für eine ganze Liste: Der Quellcode dazu ist zwar etwas länger, funktioniert aber nach dem gleichen Prinzip. Als Allererstes kommen ein paar Deklarationen: Dim texxt(100000) As String Dim temporaer As String ' das wird mal der Buffer Dim nochwas As Boolean Dim anzahl As Long Dim anz Jetzt müssen den Variablen noch Werte zugewiesen werden: anzahl = liste.ListCount For v = 0 To liste.ListCount texxt(v) = liste.List(v) Next anz = UBound(texxt) Alles, was hier passiert, ist, dass "anzahl" mit der Anzahl der Elemente der Liste gefüllt wird, "texxt" erhält den Inhalt aller Einträge (wie wichtig sind doch die Arrays...) und "anz" erhält den "UBound", also den höchsten Wert im Array (praktisch identisch mit "anzahl -1"). Jetzt zum eigentlichen Sortieralgorithmus: Zuerst brauchen wir eine For...Next-Schleife, in die eine zweite For...Next-Schleife verschachtelt wird. In dieser zweiten Schleife befindet sich der Teil, in dem das Programm prüft, ob das Element, das jeweils darunter liegt (a+1), kleiner ist und, falls erforderlich, die beiden Elemente vertauscht: For ii = 1 To liste.ListCount For a = 0 To anzahl - 1 If texxt(a) > texxt(a + 1) Then temporaer = texxt(a) texxt(a) = texxt(a + 1) texxt(a + 1) = temporaer nochwas = True vps = vps + 1 End If Next Dann findet noch eine Überprüfung statt und schließlich wird auch die erste (ii) For...Next-Schleife wieder beendet. If nochwas = False Then Exit For Next ii "nochwas" diente immer zur Überprüfung, ob die Sortierung bereits vollständig abgeschlossen ist oder noch Elemente unsortiert sind. Wenn "nochwas" wahr ist, gibt es noch unsortierte Elemente. Alle Veränderungen an der Reihenfolge der Listeneinträge sind nur in der Form erfolgt, dass die Elemente im Array getauscht wurden. Jetzt müssen wir nur noch das Array auf die Liste übertragen und fertig: liste.Clear For a = 0 To Int(anzahl) If Not texxt(a) = "" Then liste.AddItem texxt(a) End If Next Und das war es.
Teil C Die Effizienz eines Sortierverfahrens kann durch Zeitmessung am besten festgestellt werden: Man nimmt die Zeit vor dem Sortieren und nach dem Sortieren über den Aufruf "Timer" und berechnet anschließend die Differenz. Mein Sortieralgorithmus (BubbleSort) erreicht etwa folgende Werte:
Diese Werte stammen von einem Testlauf auf meinem Athlon XP 2600+ mit 512 MB DDR-RAM. Praktisch nimmt man die Zeit so: Vor dem Sortieren: Variable1 = Timer
Nach dem Sortieren: Variable2 = Timer
Zeit = Variable2 - Variable1
Alle Variablen sollten als Double deklariert sein, da eine Fließkommazahl mit doppelter Genauigkeit nun einmal die besten Ergebnisse liefert. Man kann aber auch noch einen Tauschvorgangs-Zähler einbauen. Bei jedem Tauschvorgang wird der Zähler dann um eins erhöht (Inkrement). Wenn die Sortierung abgeschlossen ist, enthält diese Variable die Anzahl der Tauschvorgänge und kann diese dann durch die Anzahl der Sekunden teilen. Damit würde man dann die "Tauschvorgänge pro Sekunde" bekommen; der beste Wert zum Feststellen der Effizienz und zum Vergleich mit anderen Sortier-Programmen.
Teil D Das Sortierverfahren, das oben als Quellcode steht, ist an sich zu langsam. Um es zu verbessern gäbe es die folgenden Möglichkeiten:
Teil E Andere schnellere Sortierverfahren sind zum Beispiel: QuickSort Austauschverfahren Quellen: Dieser Workshop wurde bereits 24.689 mal aufgerufen.
Anzeige
![]() ![]() ![]() Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv! - nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten - Symbol-Galerie mit mehr als 3.200 Icons im modernen Look Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m. |
vb@rchiv CD Vol.6 ![]() ![]() Geballtes Wissen aus mehr als 8 Jahren vb@rchiv! Online-Update-Funktion Entwickler-Vollversionen u.v.m. Tipp des Monats ![]() Manfred Bohn IndexOf für mehrdimensionale Arrays Die generische Funktion "IndexOf" ermittelt das erste Auftreten eines bestimmten Wertes in einem n-dimensionalen Array sevZIP40 Pro DLL ![]() Zippen und Unzippen wie die Profis! Mit nur wenigen Zeilen Code statten Sie Ihre Anwendungen ab sofort mit schnellen Zip- und Unzip-Funktionen aus. Hierbei lassen sich entweder einzelnen Dateien oder auch gesamte Ordner zippen bzw. entpacken. |
|||||||||||||
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein. |