Ich suche nach einer anständigen Sortierimplementierung für Arrays in VBA. Ein Quicksort wäre vorzuziehen. Oder ein anderer Sortieralgorithmus als Bubble oder Merge würde ausreichen.
Bitte beachten Sie, dass dies mit MS Project 2003 funktioniert. Vermeiden Sie daher alle nativen Excel-Funktionen und alles, was mit .net zu tun hat.
Antworten:
Schauen Sie hier :Bearbeiten: Die referenzierte Quelle (allexperts.com) wurde inzwischen geschlossen, aber hier sind die relevanten Autorenkommentare :
Beachten Sie, dass dies nur mit eindimensionalen (auch "normalen"?) Arrays funktioniert . (Es gibt eine Arbeits mehrdimensionales Array QuickSort hier .)
quelle
Ich habe den Algorithmus 'Fast Quick Sort' in VBA konvertiert, wenn es jemand anderes möchte.
Ich habe es für die Ausführung auf einem Array von Int / Longs optimiert, aber es sollte einfach sein, es in ein Array zu konvertieren, das mit beliebigen vergleichbaren Elementen funktioniert.
quelle
Erklärung auf Deutsch, aber der Code ist eine gut getestete In-Place-Implementierung:
So aufgerufen:
quelle
ByVal
da reingekommen sind . Die Verwirrung kam wahrscheinlich von der Tatsache, dass in VB.NETByVal
hier funktionieren würde (obwohl dies in VB.NET sowieso anders implementiert wäre).quelle
System.Collections.ArrayList
das sich an verschiedenen Orten in 32-Bit- und 64-Bit-Windows befindet. Mein 32-Bit-Excel versucht implizit, es an einem Ort zu finden, an dem 32-Bit-Win es speichern würde, aber da ich 64-Bit-Win habe, habe ich auch ein Problem: / Ich erhalte eine Fehlermeldung-2146232576 (80131700)
.Natürliche Zahl (Strings) Schnelle Sortierung
Nur um sich auf das Thema zu konzentrieren. Wenn Sie Zeichenfolgen mit Zahlen sortieren, erhalten Sie normalerweise Folgendes:
Aber Sie möchten wirklich, dass es die numerischen Werte erkennt und wie sortiert wird
So geht's ...
Hinweis:
Schnelle Sortierung der natürlichen Zahl
Natürlicher Zahlenvergleich (wird beim schnellen Sortieren verwendet)
isDigit (wird in CompareNaturalNum verwendet)
quelle
Ich habe einen Code als Antwort auf eine verwandte Frage zu StackOverflow gepostet:
Sortieren eines mehrdimensionalen Arrays in VBA
Die Codebeispiele in diesem Thread umfassen:
Alains optimiertes Quicksort ist sehr glänzend: Ich habe gerade ein grundlegendes Split-and-Recurse durchgeführt, aber das obige Codebeispiel verfügt über eine 'Gating'-Funktion, die redundante Vergleiche von doppelten Werten reduziert. Auf der anderen Seite codiere ich für Excel, und es gibt ein bisschen mehr Möglichkeiten für die defensive Codierung - seien Sie gewarnt, Sie werden es brauchen, wenn Ihr Array die schädliche Variante 'Empty ()' enthält, die Ihre While-Funktion unterbricht. Wend Vergleichsoperatoren und fangen Sie Ihren Code in einer Endlosschleife.
Beachten Sie, dass Quicksort-Algorithmen - und jeder rekursive Algorithmus - den Stapel füllen und Excel zum Absturz bringen können. Wenn Ihr Array weniger als 1024 Mitglieder hat, würde ich eine rudimentäre BubbleSort verwenden.
quelle
Sie wollten keine Excel-basierte Lösung, aber da ich heute das gleiche Problem hatte und mit anderen Office-Anwendungsfunktionen testen wollte, habe ich die folgende Funktion geschrieben.
Einschränkungen:
Der Aufruf von Excel 2010 aus Visio 2010 wurde getestet
Dies ist ein Beispiel zum Testen der Funktion:
Wenn jemand dies mit anderen Office-Versionen testet, posten Sie bitte hier, wenn es Probleme gibt.
quelle
msgbox_array()
eine Funktion ist, mit der sich zweidimensionale Arrays beim Debuggen schnell untersuchen lassen.Ich frage mich, was Sie zu diesem Array-Sortiercode sagen würden. Es ist schnell zu implementieren und erledigt den Job ... noch nicht auf große Arrays getestet. Es funktioniert für eindimensionale Arrays, für mehrdimensionale zusätzliche Werte müsste eine Umlagerungsmatrix erstellt werden (mit einer Dimension weniger als das ursprüngliche Array).
quelle
Ich denke, mein Code (getestet) ist "gebildeter", vorausgesetzt, je einfacher, desto besser .
quelle
Double
stattLong
überall. Zweitens wird nicht berücksichtigt, ob der Bereich mehrere Bereiche umfasst. Das Sortieren eines Rechtecks scheint nicht sinnvoll zu sein und ist natürlich nicht das, wonach das OP gefragt hat (insbesondere keine nativen Excel / .Net-Lösungen). Wenn Sie gleichsetzen, je einfacher, desto besser ist "gebildeter", wäre es dann nicht amRange.Sort()
besten , die eingebaute Funktion zu verwenden?Dies ist, was ich zum Sortieren im Speicher verwende - es kann leicht erweitert werden, um ein Array zu sortieren.
quelle
Heapsort- Implementierung. Ein instabiler O (n log (n)) (sowohl durchschnittlicher als auch schlechtester Fall), instabiler Sortieralgorithmus.
Verwendung mit :
Call HeapSort(A)
, wobeiA
ein eindimensionales Array von Varianten ist, mitOption Base 1
.quelle
@Prasand Kumar, hier ist eine vollständige Sortierroutine, die auf Prasands Konzepten basiert:
quelle
Etwas verwandt, aber ich suchte auch nach einer nativen Excel-VBA-Lösung, da erweiterte Datenstrukturen (Wörterbücher usw.) in meiner Umgebung nicht funktionieren. Im Folgenden wird die Sortierung über einen Binärbaum in VBA implementiert:
"0|2|3|4|9"
) zurück, die dann geteilt werden kann.Ich habe es verwendet, um eine rohe sortierte Aufzählung von Zeilen zurückzugeben, die für einen willkürlich ausgewählten Bereich ausgewählt wurden
quelle