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.506 mal aufgerufen.
Anzeige
Diesen und auch alle anderen Workshops finden Sie auch auf unserer aktuellen vb@rchiv Vol.6 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. |
sevWizard für VB5/6 Professionelle Assistenten im Handumdrehen Erstellen Sie eigene Assistenten (Wizards) im Look & Feel von Windows 2000/XP - mit allem Komfort und zwar in Windeseile :-) Tipp des Monats Oktober 2024 Heinz Prelle Firewall-Status unter WinXP/Vista prüfen Das Beispiel prüft, ob die Firewall unter Windows XP/Vista eingeschaltet ist oder nicht. Zudem wird eine Abfrage durchgeführt ob es sich bei dem zugrundeliegenden Betriebssystem um Windows XP/Vista handelt oder nicht. Access-Tools Vol.1 Über 400 MByte Inhalt Mehr als 250 Access-Beispiele, 25 Add-Ins und ActiveX-Komponenten, 16 VB-Projekt inkl. Source, mehr als 320 Tipps & Tricks für Access und VB |
|||||||||||||
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. |