Vor kurzem erst haben wir Ihnen gezeigt, wie sich der von Haus aus schon sehr schnelle QuickSort-Sortieralgorithmus in Bezug auf String-Arrays nochmals optimieren lässt: Heute präsentieren wir Ihnen den absoluten Hammer. Der schnellste Quicksort-Algorithmus, den es je gab Durch gezielte LowLevel Pointer-Programmierung lässt sich die Perfoamnce des Algorithmus nochmals um knapp 100% steigern! Option Explicit ' benötigte API-Deklarationen Private Declare Function lstrcmp Lib "kernel32" _ Alias "lstrcmpiW" ( _ ByVal lpString1 As Long, _ ByVal lpString2 As Long) As Long Private Declare Sub CopyMemory Lib "kernel32" _ Alias "RtlMoveMemory" ( _ Dest As Any, _ Source As Any, _ ByVal Bytes As Long) Private Declare Function VarPtrArray Lib "msvbvm60.dll" _ Alias "VarPtr" ( _ Ptr() As Any) As Long ' Quicksort für String-Arrays ' mit LowLevel Pointer-Programmierung Public Sub QuickSort_Str(ByRef StrSort() As String, _ Optional lngStart As Variant, _ Optional lngEnd As Variant) Dim TmpStrPtr(0) As Long Dim PtrSAD As Long Dim PtrBackup As Long Dim Range As Long Dim LB As Long Dim UB As Long ' Array gefüllt ? If (Not (Not StrSort)) = 0 Then Exit Sub LB = LBound(StrSort) UB = UBound(StrSort) ' Alle Werte richtig gesetzt ? If IsMissing(lngStart) Then lngStart = LB If lngStart < LB Or lngStart > UB Then Exit Sub If IsMissing(lngEnd) Then lngEnd = UB If lngEnd <= lngStart Or lngEnd > UB Then Exit Sub ' Werte neu berechnen Range = LB + UB + 1 lngStart = Abs(LB + lngStart) lngEnd = Abs(LB + lngEnd) ' String-Array auf ein Long-Array mappen PtrBackup = VarPtr(TmpStrPtr(0)) CopyMemory ByVal VarPtr(PtrSAD), ByVal VarPtrArray(TmpStrPtr), 4 CopyMemory ByVal PtrSAD + 12, VarPtr(StrSort(LB)), 4 CopyMemory ByVal PtrSAD + 16, Range, 4 ' Sortieren des Long-Arrays, gefüllt mit String-Pointern SortEx TmpStrPtr, CLng(lngStart), CLng(lngEnd) ' Long-Array wiederherstellen CopyMemory ByVal PtrSAD + 12, PtrBackup, 4 CopyMemory ByVal PtrSAD + 16, CLng(1), 4 End Sub ' Long-Array mit String-Pointern sortieren Private Sub SortEx(ByRef ptrSort() As Long, _ StartSort As Long, EndSort As Long) Dim TmpPtr As Long Dim TmpPtr2 As Long Dim I As Long Dim J As Long TmpPtr = ptrSort(((StartSort + EndSort) \ 2)) I = StartSort J = EndSort Do Do While (lstrcmp(ptrSort(I), TmpPtr) < 0): I = I + 1: Loop Do While (lstrcmp(ptrSort(J), TmpPtr) > 0): J = J - 1: Loop If (I <= J) Then TmpPtr2 = ptrSort(I) ptrSort(I) = ptrSort(J) ptrSort(J) = TmpPtr2 I = I + 1: J = J - 1 End If Loop Until (I > J) ' Rekursion (Funktion ruft sich selbst auf) If (StartSort < J) Then SortEx ptrSort, StartSort, J If (I < EndSort) Then SortEx ptrSort, I, EndSort End Sub Machen wir einen Test Dieser Tipp wurde bereits 23.399 mal aufgerufen. Voriger Tipp | Zufälliger Tipp | Nächster Tipp
Anzeige
Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen vb@rchiv Vol.6 (einschl. Beispielprojekt!) 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. |
sevISDN 1.0 Überwachung aller eingehender Anrufe! Die DLL erkennt alle über die CAPI-Schnittstelle eingehenden Anrufe und teilt Ihnen sogar mit, aus welchem Ortsbereich der Anruf stammt. Weitere Highlights: Online-Rufident, Erkennung der Anrufbehandlung u.v.m. Tipp des Monats März 2024 Dieter Otter UTF-8 Konvertierung von Dateien und Strings VB6 selbst verfügt über keine Funktionen zur UTF-8 Konvertierung von Daten. Mit Hilfe des ADODB.Stream-Objekts lassen sich diese fehlenden Funktionen aber schnell nachrüsten. sevAniGif (VB/VBA) Anzeigen von animierten GIF-Dateien Ab sofort lassen sich auch unter VB6 und VBA (Access ab Version 2000) animierte GIF-Grafiken anzeigen und abspielen, die entweder lokal auf dem System oder auf einem Webserver gespeichert sind. |
||||||||||||||||
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. |