Thomas Risi Softwareentwicklung
Addins - Datenbanklösungen - Komponenten - RTDServer - WebServices
Sortieralgorithmen
Jeder der sich mit Programmierung befasst, wird früher oder später mit dem
Problem konfrontiert, ein Array oder Datensätze zu sortieren. Um diese Aufgabe zu
lösen, wurden verschiedene Ansätze entwickelt. Es läßt sich nicht pauschal sagen,
daß das eine Verfahren schneller als das Andere ist, und jeder Algorithmus hat
seine Daseinsberechtigung. Für große Datenmengen ist QuickSort erste Wahl,
während bei kleineren Datenmengen andere Verfahren bessere Ergebnisse liefern.
Einen Überblick über das Laufzeitverhalten verschiedener Algorithmen findet sich
z.B. in dem Buch C/C++ von Ulrich Kaiser (Galileo Computing).
Nachstehend finden Sie einige Algorithmen zum Einsatz in VB/VBA. Beachten Sie,
daß den Funktionen Variant - Arrays übergeben werden. Das bedeutet, daß Sie
die Funktionen Ihrem Anwendungsfall anpassen können (z.B. Byte-Arrays, Long-Arrays).
Sub BubbleSort(ByRef data() As Variant)
Dim OG&, i&, h As Variant
OG = UBound(data)
Do
For i = 0 To OG - 1
If data(i) > data(i + 1) Then
h = data(i)
data(i) = data(i + 1)
data(i + 1) = h
End If
Next i
OG = OG - 1
Loop While OG > 1
End Sub
Sub SelectionSort(ByRef data() As Variant)
Dim OG&, i&, j&, k&, h As Variant
OG = UBound(data)
For i = 0 To OG - 1
h = data(i)
k = i
For j = i + 1 To OG
If data(j) < h Then
h = data(j)
k = j
End If
Next j
data(k) = data(i)
data(i) = h
Next i
End Sub
Sub ShellSort(ByRef data() As Variant)
Dim OG&, i&, j&, k&, h As Variant
OG = UBound(data)
k = OG \ 2
While k > 0
For i = 0 To OG - k
j = i
While (j >= 0) And (data(j) > data(j + k))
h = data(j)
data(j) = data(j + k)
data(j + k) = h
If j > k Then
j = j - k
Else
j = 0
End If
Wend
Next i
k = k \ 2
Wend
End Sub
Sub QuickSort(data() As Variant, Optional UG, Optional OG)
Dim P1&, P2&, T1 As Variant, T2 As Variant
UG = IIf(IsMissing(UG), LBound(data), UG)
OG = IIf(IsMissing(OG), UBound(data), OG)
P1 = UG
P2 = OG
T1 = data((P1 + P2) / 2)
Do
Do While (data(P1) < T1)
P1 = P1 + 1
Loop
Do While (data(P2) > T1)
P2 = P2 - 1
Loop
If P1 <= P2 Then
T2 = data(P1)
data(P1) = data(P2)
data(P2) = T2
P1 = P1 + 1
P2 = P2 - 1
End If
Loop Until (P1 > P2)
If UG < P2 Then QuickSort data, UG, P2
If P1 < OG Then QuickSort data, P1, OG
End Sub
© 2001 -
by Thomas Risi