|
Antwort |
Registriert seit: 25. Nov 2005
Hallo Delphianer und vor allem diesmal konkret Sortierfreunde!
Es ist mal wieder soweit, hier ist das Ergebnis meiner Hobbyprogrammiererei der letzten Monate: Visualisierte (oder noch genauer: animierte) Sortieralgorithmen. Bekannt sind diese Algorithmen natürlich (und das Thema mag so mancher als abgedroschen empfinden), jedoch gefiel mir die graphische Umsetzung derselben, die ich bislang fand, nicht. So wird zum einen oft der Bildschirm nicht ausgenutzt, was die mögliche Elementanzahl verringert. Zum anderen halte ich Balken-/Liniendarstellungen für prägnanter als schnöde Pixel. Dann liegen oft nur Zufallspermutationen (einer aufsteigenden Menge) oder Zufallszahlen als zu sortierende Startmengen zugrunde. Das alles habe ich etwas erweitert, um ein wenig „Kinogefühl“ aufkommen zu lassen. Die Bedienung des Programmes ist m. E. so simpel und intuitiv möglich, daß es nicht weiter beschrieben werden muß. Mein Interesse lag zuvörderst bei solchen Sortieralgorithmen, bei denen die Visualisierung wenigstens halbwegs erkennen läßt, was intern abläuft. Die temporäre Nutzung zusätzlichen Speichers wie bei den klassischen Mergesorts und bei den Bucketsorts wird nicht visualisiert, sondern eben nur das, was in und mit der „Hauptmenge“ geschieht. Desweiteren beschränkte ich mich wegen der Darstellungsorientierung auf die Sortierung linearer, d.h. eindimensionaler Datenmengen, also Arrays (die Werte werden, entsprechend ihrer Größe, natürlich als verschiedenlange Balken dargestellt). Einbezogen habe ich alle Komplexitätsklassen dieser Algorithmen, was sich auch in der Laufzeit bemerkbar macht, ohne jedoch die Algorithmen nach Komplexitätsklasse vorzuselektieren oder zu ordnen (nur alphabetisch nach Namen). Eingeweihte wissen ohnehin bescheid. Das wären:
Als Schmankerl habe ich optional bei Mergesort und Naturalmergesort das “In-Place-Mergen” nach der Idee Siegfried Sielaffs („Simplewapsort“) implementiert, mich jedoch mit der Rekursion desselben nicht zufriedengegeben, sondern es nach der Idee Robert Sedgewicks analog seinem Quicksort iterativ umgestaltet, wobei ein eigens dafür genutztes Datenfeld namens Stack letztlich den Stack emuliert und der deshalb als Namenspatron herhalten mußte, jedoch deutlich weniger (Haupt-)Speicher, als was vom Stack benutzt würde, verbrauchen und zudem laufzeitgünstiger sein dürfte: Somit enthält mein Programm einen Sortieralgorithmus, der bei dem heutigen Softwareniveau (meine ich positiv!) als optimal angesehen werden kann:
All' diese Eigenschaften besitzt das Natural Mergesort mit dem iterativen In-Situ-Verschmelzen. Die langsam(st)en Algorithmen lassen sich mit ESC abbrechen, während die optionale Bremse bei den schnell(st)en Algorithmen eingefügt wurde. Wessen Computer andere Geschwindigkeiten hat/haben, der kann und möge das natürlich entsprechend anpassen, Quelltexte liegen ja mit bei. Angefangen hatte ich mit Delphi-2 (igitt), bei dem die Arrays im Quelltext entsprechend den einmal einzugebenden Bildschirmkoordinaten (bei mir 1600x1200) vor der Compilierung statisch zu dimensionieren sind. Das ist natürlich völlig veraltet, so daß ich in Richtung Delphi 4 aufbohrte: Eines mit einmaliger Arraydimensionierung während des Startes und eines, das die Arrays entsprechend der eingestellten Darstellungsfenstergröße automatisch während der Laufzeit anpaßt (was aber nicht optimal sein soll). Meine wichtigsten Quellen der Algorithmen waren das Werk „Algorithmen und Datenstrukturen“ von Robert Sedgewick sowie die sehr umfangreiche Internetseite zu Sortieralgorithmen von Peter Weigel: http://home.arcor.de/peter-weigel/sortieralgorithmen (die schaltete er dankenswerterweise privat wieder frei, nachdem die von ihm vor einigen Jahren abgegebene http://www.sortieralgorithmen.de seit Monaten nicht mehr erreichbar ist). Zusätzlich fand ich im Internet noch die eine und andere gute Idee. Von mir stammen nur die trivialen Varianten (nicht das Original) des Bozosorts sowie die Nach-Delphi-Portierung des In-Place-Mergens. Deshalb ist das Programm natürlich komplett frei. Sollte noch jemand eine gute Idee für einen visualisierungswerten Algorithmus haben, dann her damit, oder er baut ihn sich selbst ein. Trotz aller akribischer Proben und Kontrollen kann ich bei Programmen dieser Größe Fehler leider nicht ausschließen, würde mich aber über diesbezügliche Rückmeldungen dankend freuen. Auch als Demonstrationsprogramm z.B. für den Informatikunterricht kann ich mir dieses Programm gut vorstellen. Zudem sind Sortieralgoritmen die im wahrsten Sinne des Wortes offensichtliche Widerlegung der immer noch zu findenden pauschalen und damit falschen Behauptung, Algorithmen seien „Rechen- bzw. Berechnungsvorschriften“. Kleiner Tip: Swirlsort mit der Werteerzeugung "natürliche Zahlen (je einmal) und der Startmengenstruktur „Aufsteigend, größtes Element vorn“ starten - ich wette, daß so etwas noch niemand von Euch je gesehen hat! Viel Spaß! Delphi-Laie Edit: Neue Version(en) mit weiteren sechs verschiedenen Startmengen unterschiedlichen Ordnungsniveaus hochgeladen. Edit 2: Einen großen und mehrere kleine Fehler behoben; die Bremse funktioniert jetzt bei allen Algorithmen. Edit 3: Swirlsort korrigiert, funktioniert jetzt auch mit Zufalls- und Konstantzahlen. Edit 4: Splitsort zeigt gegenüber zuviel teilgeordneten (höheres Ordnungsniveau als Zufall) Startmengen ein zu ungünstiges (quadratisches?) Laufzeitverhalten, deshalb „Aufnahme“ in die Menge der abbrechenbaren Algorithmen. Edit 5: Gültigkeitsbereich dreier Graphikprozeduren von global in lokal verändert: In aufrufende Prozedur verschoben. Edit 6: 4 weitere Startmengen hinzugefügt; die (Maximal-)Auflösung in der undynamischen (D2&3-)Variante auf WUXGA 16:10 (1920*1200) erhöht. Edit 7: Fehler bei der Spaltenanzahlzuordnung weniger Startmengen beseitigt. Edit 8: Das einfache (rekursive) Mergesort war kein stabiler Sortieralgorithmus, jetzt „stablisiert“ und zudem einen effizienteren Ansatz mit der temporären Auslagerung nur eines Teilarrays gewählt (nach Mergesort vom ITI der FH Flensburg). Edit 9: Kleine Fehler beseitigt. Edit 10: Kleinen, aber fatalen Fehler in Mergesort bereinigt (< statt <= bewirkte inverse Sortierreihenfolge bei konstanten Elementen (also Instabilität, inverse Stabilität sozusagen). Edit 11: Beide Quicksorts beschleunigt: Tausch nur noch nach Elementevergleich. Damit vermischen beide Algorithmen gleichgroße Elemente auch nicht mehr unkontrolliert, sondern werden wenigstens „invers stabil“ (=bei gleichgroßen Elementen wird deren Reihenfolge invertiert). Edit 12: Borderstyle vom Sortierformular so geändert, daß es nunmehr ein echtes Fenster (also mit Rahmen) ist. Mit dem Setzen des Formstyles des Sortierformular auf fsStayOnTop sollen zudem die störenden Neuzeichnungen anzahlig zurückgedrängt werden. Edit 13: Subtilen Fehler bei der Bestimmung der maximalen Spalten- und Zeilenanzahl im Fenstermodus beseitigt (?). Funktionierte nicht richtig, nachdem das Formular 2 (zum Sortieren) schon mal visible war bzw. benutzt wurde. Edit 14: Insertionsort beschleunigt (zyklisches Verschieben anstatt häufigen Vertauschens). 2 weitere Insertionsorts hinzugefügt (Variante 3 zeigt ziemlich selten einen nicht reproduzierbaren Fehler). Das Sortierformular, sofern als Fenster benutzt (also mit Rahmen), behält nunmehr seine Position, zu der es verschoben wurde (vorher immer Bildschirmzentrierung desselben). Edit 15: Subtilen Fehler bei der Generierung der Startmenge „2 separate absteigende Teilmengen“ korrigiert. Dynamische Längenanpassung der (zu sortierenden) (Haupt-)Menge korrigiert. Edit 16: Farb- und Schwarz(-Weiß)-Varianten beider Programme verein(ig)t. Edit 17:
Edit 19:
Edit 21: Programmhauptformulartitelzeile erweitert. Der Neuzeichnenprozedur in den D4-Programmvarianten das irrtümlich fehlende "BringToFront" hinzugefügt. Edit 22: Shell- mit den beiden Shearsorts für eine alphabetisch korrekte Reihenfolge vertauscht. Edit 23: Meldung über Anpassung der Spaltenanzahl an eine 2er-Potenz (bei 2 Sortieralgorithmen) in den Vordergrund geholt, damit diese „wegklickbar“ ist. Fenster„handhabung“ in jener Prozedur (zur Anpassung der Spaltenanzahl an eine 2er-Potenz) verbessert. Edit 24:
Edit 25: Kleine Fehlerbereinigungen:
Edit 26: Kleine Fehlerbeseitigungen:
Edit 27: Formular 2 (für die Sortierdarstellung) nunmehr immer zentriert. Edit 28: Showmessage für Schleifenanzahlszähler nunmehr immer im Vordergrund. Edit 29:
Edit 30: Vorsortierbarkeit (mit Shellsort oder binär) der Startmengen mit variabler (Vor-)Sortierschleifenanzahl hinzugefügt. Kleinere Quelltextverbesserungen. Edit 31:
Edit 32: Darstellung der speziellen Sortieralgorithmen nur noch mit schwarzen Balken, um Irritationen und Fehlervermutungen zu vermeiden. Diverse Fehlerbereinigungen und Detailverbesserungen. Edit 33: Diesmal nur Verbesserungen „unter der Haube“:
Edit 34:
Edit 35: Anzeige des Schleifenzählers bei den langsamsten Algorithmen nach Sortierende oder -abbruch nunmehr optional. Edit 36:
Edit 37: Skiplistsort überarbeitet. Edit 38: Smoothsort überarbeitet:
Edit 39: Kleine Fehlerbereinigungen. Edit 40: Das komplexere Swapmergen (Swapsort nach Siegfried Sielaff) für Merge- und Natural Mergesort hinzugefügt. Edit 41: Beim klassischen Mergesort die Rekursion und damit Stackbenutzung entfernt. Die Verwaltung/„Handhabung“ des Pseudstacks (Stackemulation) überarbeitet/verbessert. Edit 42: Bitonic Mergesort 2 (=bitonisches Natural Mergesort) korrigiert. Edit 43: Bubblesort verbessert (effizienter gestaltet): zyklische Verschiebungen statt Vertauschungen. Edit 44: Fehler in den Lazarusversionenen dieser Sortierprogramme beseitigt: Bogosort 2 zählte seine Schleifen(durchläufe) nicht. Edit 45:
Edit 46:
Edit 47: (Abschaltbare) Meldung wegen der nur schwarzen Linien bei den speziellen Sortieralgorithmen hinzugefügt. Kleinere Fehlerbereinigungen. Edit 48:
Edit 49: Quelltexte überarbeitet. Edit 50: Quelltexte nochmals leicht überarbeitet. Kleinen Fehler im beschleunigten Selectionsort behoben. Edit 51:
Edit 52: Jeweils ein Natural- und ein Mergesort „stabilisiert“, und zwar die mit dem Shufflemerge nach John Ellis & Minko Markov. Bubblesort teilweise beschleunigt; es ist jetzt adaptiv, d.h., es sortiert bei (vor-)sortierten Mengen schneller. Edit 53:
Edit 54: Ein weiteres In-Situ-Mergesort hinzugefügt, und zwar eines mit Shufflemerge nach Elif Acar, Mehmet Emin Dalkiliç und Görkem Tokatli. Edit 55:
Edit 56: Kleinen Fehler in den Lazarusversionen behoben, der darauf beruhte, daß die Wertzuweisung an ein Spinedit nicht das Ereignis "OnChange" auslöst. Außerdem eine englischsprachige Variante dieses Programmes (beruht auf dem Delphi-2-Quelltext) hochgeladen. Edit 57: Parametereingabe für n- & F-Heapsort hinzugefügt. Kleine Fehlerbereinigung bei der Eingabe der Zeilen- und Spaltenanzahl. Edit 58:
Edit 59: Kleine Verbesserungen bei der Eingabe (Combobox ist jetzt nicht mehr dauerhaft editierbar) und bei der Ausgabe (Extraklick nach Sortierende und -abbruch ist jetzt nur noch relevant, wenn keine Messagebox mehr erscheint). Edit 60: Parametereingabe für die beiden Shearsorts hinzugefügt. Edit 61: Nunmehr ist optionales Speichern (beim Programmende) und Laden (beim nächsten Programmstart) aller wichtigen Einstellungen über eine weitere Checkbox möglich. Zudem wurde der Quellcode zur Größenjustierung des Sortierformulares komplett überarbeitet, er müßte nunmehr stabiler und fehlerärmer sein. Edit 62: Die Parametereingabe für manche Algorithmen ist nunmehr optional. Edit 63: Die Sortierkinos sind jetzt netzwerktauglich. Werden sie in einem Verzeichnis ausgeführt, für das keine Schreibrechte existieren, so werden die Inidateispeicherungen in das nutzerspezifische Temp-Verzeichnis verlagert (auf das immer Schreibrechte existieren sollten oder müssen). Damit können die Exedateien auch auf schreibgeschützten Servern gelagert und von Workstations aus gestartet und ausgeführt werden. Ansonsten, bei Schreibrechten im selben Verzeichnis, erfolgt die Schreibung der Inidateien in dasselbe Verzeichnis, in dem auch die Exedatei liegt - wie zuvor. Edit 64: Optionale Sortierzeitmessung hinzugefügt, Ausgabe verbessert (nur noch ein Meldungsfenster nach jeweiligem Sortierende) und mehrere kleine Fehler beseitigt. Edit 65: Fehlerhaftes Verhalten beseitigt, das nur in Windows 95 & 98 auftritt, beseitigt: Obwohl Deletefile true zurückliefert, wird die probehalber erstellte Datei (um die Schreibrechte zu prüfen) aus unbekanntem Grunde nicht gefunden und folglich nicht gelöscht. Da auch Deletefile auf einer Windows-API-Funktion beruht, vermute ich einen Windowsfehler. Edit 66: Zwei neue Startmengen (die mit "Teilmengen" bezeichneten) und die Option, wie diese angeordnet werden, hinzugefügt. Kleine Fehlerkorrekturen. Edit 67: Zwei neue Vorsortieralgorithmen (Natural Mergesort und Shearsort) hinzugefügt. Mehrere kleine Fehler in bezug auf die Eingabe der Parameter (für mache Sortieralgorithmen) behoben. Edit 68:
Edit 69: 2 Straigth-Radix-Sorts (LSD und MSD, wobei das erstere das alte ersetzte) und das sog. Stupidsort (der einfachste aller Sortieralgorithmen) hinzugefügt. Edit 70: Nunmehr sind ALLE Sortieralgorithmen abbrechenbar. Bei Bogosort kann man jetzt den swapbasierten Enumerationsalgorithmus zwischen dem nach Steinhaus-Johnson-Trotter und einem ziemlich neuen nach Oleg Viktorov wählen. Edit 71: 3 weitere Radixsorts hinzugefügt sowie kleine Fehler beseitigt. Edit 72: Bremse verbessert (jetzt nicht mehr sleep-, sondern schleifenbasiert). Edit 73: Splaysort hinzugefügt. Die Idee dazu stammt vonhier und der Pascal-/Delphiquelltext von dort. Edit 74: Radixsort MSD bei den Vorsortieralgorithmen hinzugefügt, jetzt gibt es dort 2 Radixsorts, bei denen zwischen LSD und MSD unterschieden wird. Edit 75: Fehler in Insertionsort 2 & 3 behoben (Abbruch führte nicht zur Rückkehr zum Sortierauswahlformular). Edit 76: Die (In-)Stabilität jedes Sortieralgorithmus' wird jetzt schon in der Auswahlliste angezeigt, deshalb ist jetzt die Anzeige der (In-)Stabilität nach jedem Sortieren jetzt mehr voreingestellt, aber weiterhin möglich. Edit 77:
Edit 78: Kleine Codeoptimierungen. Edit 79:
Edit 80:
Edit 81:
Edit 82:
Edit 83: In-situ-Blockswapping- bzw. -Arrayrotationsalgorithmus (für Symmetry Partition Sort), der nur aus einer Schleife besteht und sehr schnell ist, hinzugefügt - gefunden in den Diskussionsbeiträgen unter http://www.geeksforgeeks.org/program...sal-algorithm/ Edit 84: Cycle-Leader-Block-Swapping-Algorithmus (für Symmetry Partition Sort) hinzugefügt. Der Bremsfaktor kann nunnmehr auch zur Sortierlaufzeit verändert werden: '-' verlangsamt, '+' erhöht die Sortiergeschwindigkeit. Edit 85: Die beiden parallelen bzw. Multithreadsortieralgorithmen (Merge- und Quicksort) sind jetzt abbrechenbar. Edit 86: Multithreadingsortieralgorithmen überarbeitet. Da das Multithreadingmergesort auf Mehrprozessorcomputern mit Windows XP fehlerhaft läuft und der Grund dafür der zu sein scheint, daß das mit Compilaten Delphi<5 auftritt, sind die Compilate (Exe-Dateien) nunmehr alle mit Delphi 5 erstellt. Edit 87: Gleichzeitigkeit beim Multithreading-Quicksort verbessert / erhöht. Der entscheidende Hinweis kam von Daniel in diesem Beitrage. Vielen Dank dafür! Edit 88: Gleichzeitigkeit beim parallelen bzw. Multithreading-Mergesort erhöht bzw. verbessert. Außerdem bleibt das Programm auf NTx-Windows nicht mehr bei 37 bzw. 38 OnPaint-induzierten Neuzeichnen-Threads stehen (bei Vista sind es 37, bei XP und davor 38 Threads). Edit 89: Im Gegensatz zu dieser Behauptung ist Naturalmergesort sehr wohl parallelisierbar - eine Multithreadingversion dafür wurde implementiert. Edit 90: Kleine Codeoptimierungen in den oet-Prozeduren und bei den Shearsorts. Edit 91:
Edit 92: Die 3 Arraydimensionierungsmethoden (statisch, dynamisch zum Programmstart und dynamisch zur Laufzeit) wurden vereinigt. Sie sind jetzt über Compilerschalter am Beginn der Unit 1 separat erzeugbar. Edit 93:
Edit 94: Darstellung der Menge, wenn alle Linien (neu)gezeichnet werden, (vor allem auf modernen Windows) in den beiden Delphi-Versionen beschleunigt; der Dank geht an die Antwortgeber in dieser Diskussion. Dadurch kann zudem beim Neuzeichnen auf Extrathreads verzichtet werden. Edit 95:
Edit 96:
Edit 97: Die Anzahl simultaner Threads ist nunmehr bei allen iterationsbasierten Multithreadingsortieralgoritmen begrenzbar. Edit 98: Bei den beiden Delphi-Versionen läßt sich das Ausgabeverhalten jetzt nicht nur beim Multithreading-Quicksort, sondern auch beim iterativen, vom Mainthread aus gestartetem Naturalmergesort und Shearsort 2 beeinflussen. Edit 99:
Edit 100: Wer den weißen Hintergrund nicht mag, kann diesen jetzt über eine Checkbox abwählen, er wird dann schwarz. Bei monochromatischen Startmengen und bei speziellen Sortieralgorithmen werden dann weiße anstatt schwarzer Linien zur Elementedarstellung genutzt. Edit 101:
Edit 102: Domain Sortierkino und Sortier-Kino veröffentlicht. Edit 103:
Edit 104:
Edit 105:
Edit 106:
Edit 107:
Edit 108:
Edit 109:
Edit 110:
Edit 111:
Edit 112:
Edit 113:Stackemulatorklasse leicht überarbeitet und fehlerbereinigt Edit 114: Der Parameter (Wachstumsfaktor) bei Proportion Extend und Symmetry Partition Sort kann numehr als Real-/Gleitkommazahl und auch kleiner als 2 eingegeben werden. Edit 115: 13 Mischungsalgorithmen implementiert, um den Gegensatz zum Sortieren zu demonstrieren. Edit 116:
Edit 117:
Edit 118:
Edit 119:
Edit 120:
Edit 120: Die Startmenge „Permutation, Quadrat“ ist jetzt auch bei ungeraden Elementeanzahlen ohne Darstellungsmangel. Edit 121: Die Startmengen lassen sich jetzt über zwei Comboboxen „Werteerzeugung für die Startmenge“ und „Struktur der Startmenge“ übersichtlicher erzeugen - damit ist zudem eine Erhöhung der Anzahl möglicher Startmengen verbunden. Edit 122:In die Liste „Werteerzeugung für die Startmenge“ wurde der Eintrag „n Werte, kubisch verteilt“ hinzugefügt (das Prinzip gilt auch für alle höheren ungeraden Potenzen). Das Interessante an dieser Verteilung ist, daß die kumulierte Verteilungsfunktion (erkenntlich an der Oberkante sortierten Menge) zwar stetig, aber an einer Stelle (nämlich in der „Mitte“) nicht differenzierbar ist. Edit 123:
Edit 124:
Edit 125:
Edit 126: Optimierte Variante des inversen Bubblesorts gemäß diesem Quellcode implementiert. Edit 127: 2 kleine Fehler korrigiert. Edit 128: Option (Checkbox) „maximaler Wertebereich“ hinzugefügt. Edit 129: IniFile-KLasse „TIniFile“ mit „TMemIniFile“ ersetzt (gilt für die beiden Delphi-Programme und dort ab Compilation mit Delphi 4, darunter bleibt TIniFile gültig). Edit 130:
Edit 131:
Edit 132: Multithreading-Sortieralgorithmen geringfügig überarbeitet Edit 133:
Edit 134: Implementation der inversen Variante des Slowsorts. Edit 135: 6 weitere Werterzeugungsmethoden für die Startmenge(n) hinzugefügt Edit 136:
Edit 137: Multithreadingalgorithmen verbessert Edit 138:
Edit 139: 5 Multithreading-Sortieralgorithmen (Comb-, Insertion-, Oet- und Shakersort, letzteres aus Main- und mit extra Startthread) implementiert[*]kleine Fehlerkorrekturen Edit 140:
Edit 141:
Edit 142:
Edit 143:
Edit 144:
Edit 145:
Edit 146:
Edit 147:
Edit 148:
Edit 149:
Edit 150:
Edit 151: Smoothsort von Hartwig Thomas (Klasse und Routinen) geringfügig überarbeitet und optimiert Edit 152:
Edit 153:
Edit 154:
Edit 155:
Edit 156:
Edit 157:
Edit 158: In-Situ-Variante des Splitsorts implementiert. Edit 159:
Edit 160:
Edit 161: Stabiles Heapsort und eine weitere Smoothsort-Variante gemäß diesem bzw. jenem Projekt implementiert. Edit 162:
Edit 163:
Edit 164:
Edit 165:
Edit 166:
Edit 167: Mergesort mit In-Situ-Verschmelzen aus dem zuvor genannten Projekt extrahiert und in dieses Projekt implementiert. Edit 168:
Edit 169:
Edit 170: Fehler beseitigt, der auftrat, wenn bei den Zufallszahlen die Anzahl n verschiedener Elemente auf 1 gesetzt und danach für die Werteerzeugung die natürlichen Zahlen (je einmal) gewählt wurde(n). Edit 171:
Edit 172:Ein Merge- und ein Naturalmergesort jeweils mit einem neuen Mergingalgorithmus nach Prof. John Ellis und Prof. Ulrike Stege gemäß dieser Anleitung implementiert. Laut Beschreibung ist er stabil, jedoch konnte die Stabilität in dieser Implementation nicht erreicht werden, Grund unbekannt. Wird sobald wie möglich verbessert. Edit 173:
Edit 175: Den neuen Mergealgorithmus von Prof. John Ellis und Prof. Ulrike Stege erneut überarbeitet (2 weitere Fehler korrigiert und ihn zudem „stabilisiert“, d.h., stabil gemacht). Edit 176: Quelltext überarbeitet, den Code (auch den ausführungsrelevanten) dabei etwas komprimiert. Edit 177: Patiencesort in situ (2 Varianten) und ex situ implementiert. Edit 178:
Edit 179: 4 weitere Sortieralgorithmen hinzugefügt:
Edit 180:
Edit 181:
Edit 182:
Edit 183: Blockmerge sowie stabiles und instabiles Partitionsmerge nach Luis Isidoro Trabb Pardo gemäß seiner Anleitung "Stable sorting and merging with optimal space and time bounds" implementiert. Edit 184:
Edit 185:
Edit 186: Die globale Stabilisierung nach dem Sortieren wurde beschleunigt; sie funktioniert jetzt außerdem auch nach den simultanen Sortieralgorithmen Edit 187:
Edit 188: Stabiles Quicksort mit einem stabilen Partitionsalgorithmus und einen weiteren Blockswappingalgorithmus, beide nach Ronald Linn Rivest, implementiert Edit 189: Die Option, mit der einzugebende Parameter hinzu- oder abgeschaltet werden können, ist nunmehr nur noch bei den dafür relevanten Sortieralgorithmen freigeschaltet. Edit 190: 4 neue Sortieralgorithmen hinzugefügt:
Edit 191:
Edit 192: Drei Verschmelzungsalgorithmen hinzugefügt:
Edit 193: Drei Mergesorts mit asymmetrischer Partitionierung hinzugefügt, zwei davon erlauben eine Eingabe zur Variation des Größenverhältnisses der Teilarrays. Edit 194:
Edit 195:
Edit 196: 6 weitere Mergingalgorithmen nach Jyrki Katajainen & Co. hinzugefügt:
Edit 197: Die Möglichkeit, mit jedem Mausklick auf das Verarbeitungsformular eine neue Startmenge zu erstellen, kann jetzt mit einer weiteren Checkbox abgeschaltet werden. Edit 198:
Edit 199:
Edit 200: Nur interne Änderungen ohne Einfluß auf Bedienung und / oder Animation:
Edit 201:
Edit 202:
Edit 203:
Edit 203: Mergealgorithmus von Heikki Mannila und Esko Ukkonen, zu finden je einmal bei den Merge- und den Naturalmergesorts, überarbeitet. Er ist jetzt (pseudo)rekursiv. Edit 204: Positionierung der Werteausgabemitteilungsfensters überarbeitet (in den beiden mit Delphi compilierten Versionen). Edit 205: Rekursives Naturalmergesort hinzugefügt (inspiriert von http://cs.uno.edu/people/faculty/bil...-Regl-1993.pdf). Edit 206:
Edit 207: Annealing- und Spin-the-bottom-Sort (auch hier) von Prof. Dr. (PhD) Michael T. Goodrich sowie zwei Quicksorts mit perfekter bzw. fast perfekter Halbierung bei der Partitionierung implementiert. Edit 208: Bitonisches Merge- und Naturalmergesort je mit rekursiver Verschmelzungsprozedur für beliebige Elementeanzahlen und mithin auch für unterschiedlich große Teilarrays implementiert (iterative Verschmelzungsprozedur auch für verschieden große Teilarrays und damit für (Natural-)Mergesort für beliebige Elementeanzahlen war schon implementiert). Edit 209: Randomisiertes Shellsort (auch hier) nach Michael T. Goodrich hinzugefügt. Edit 210: 3 vereinfachte und modifizierte Versionen des Zig-Zag-Sorts (auch hier) nach Michael T. Goodrich implementiert. Edit 211: Fünf Versionen des Fun-Sortes implementiert Edit 212: Jeder Verarbeitungsalgorithmus (Sortieren bzw. Mischen) kann mit Druck auf „P“ oder „p“ prozessorschonend unterbrochen (pausiert) und mit gleichenm Drucke auch wieder fortgesetzt werden. Edit 213: 4 weitere Startmengenstrukturen (je zweimal zwei verschiedengroße sortierte Teilmengen und mehrere verschiedengroße sortierte Teilmengen) implementiert Edit 214:
Edit 215: Vom beschleunigten Naturalmergesort, das abfallende Teilmengen erkennt und invertiert, eine instabile Version implementiert. Edit 216: Ein weiteres Bead-/Gravitysort hinzugefügt. Edit 217:
Edit 218:
Edit 219:
Edit 220:
Edit 221:
Edit 222: Iteratives Odd-Even-Mergesort, iteratives Pairwise Sorting Network und Dual-Pivot-Quicksort, alle gefunden in diesem Javaprojekt von Piotr Grochowski, hinzugefügt. Edit 223: Einige Startmengenstrukturen können jetzt mit unterschiedlicher Qualität erstellt werden (die exakten Methoden sind die bisher schon implementierten). Edit 224: 14 weitere Shellsorts mit je verschiedenen Distanzfolgen hinzugefügt. Edit 225:
Edit 226: Binary Search Tree Sort auf der Grundlage des Quelltextes von Roman Tereshin alias ramntry implementiert. Edit 227: 3 Sortieralgorithmen implementiert:
Edit 228: Den Blocktauschalgorithmus aus dem Rotatequicksort der Liste (Radiogroup) der Blockswappingalgorithmen hinzugefügt. Edit 229:
Edit 230:
Edit 231:
Edit 232:
Edit 233: Das Fisher-Yates-Mischen gibt es jetzt auch in der Vorwärtsvariante (die bisherige arbeitete rückwärts) und sowohl die Vorwärts- als auch die Rückwärtsvariante nunmehr in zwei Versionen. Edit 234: Healysort, Merge2Sort und Shovesort (letzteres vorwärts und rückwärts) hinzugefügt. Edit 235: Beim Swirlsort eine Vorwärtsvariante implementiert (die bisherige funktioniert rückwärts). Edit 236:
Edit 237:
Edit 238:
Edit 239:
Edit 240:
Edit 241: Blockquicksort mit Finish-Partitionierung nach Stefan Edelkamp und Armin Weiß (Quelle unter Edit 239) sowie ein weiteres iteratives Quicksort implementiert. Edit 242: Friendssort nach Sardar Zafar Iqbal, Hina Gull und Abdul Wahab Muzaffar sowie beschleunigtes Friendssort implementiert. Edit 243: Merge- und Naturalmergesort mit Wandermerge (eigenentwickelter, bedingt stabiler In-Situ-Verschmelzungsalgorithmus) implementiert. Findet sich jeweils direkt unter den Einträgen des Merge- bzw. Naturalmergesorts mit dem Verschmelzungsalgorithmus nach Vaughan Donald Pratt. Edit 244: Q-Sort (auch dort) von Jon Louis Bentley implementiert. Edit 245: Nur für die beiden Delphi-Versionen:
Geändert von Delphi-Laie ( 3. Okt 2021 um 10:13 Uhr) |
Delphi 10.1 Berlin Starter |
#2
Und jetzt die Zugabe - die Farbvariante der drei o.a. Programme!
Damit schleppt jeder Wert im Verlaufe der Sortierung anhand seiner Farbe seine (ungefähre) Startposition mit sich umher. Auf diese Weise ist es möglich, die (In-)Stabilität mancher Sortieralgorithmen optisch wahrzunehmen. Dazu empfehle ich die letzte Startmenge - die mit zwei konstanten Teilmengen, abfallend. Achtung: Diese Farbzuordnung funktioniert nicht bei den speziellen Sortieralgorithmen (Bucketsorts): Beatsort, Distribution Counting und Straight Radix Sort, d.h. konkret, die Farbzuordnung bleibt im Verlaufe der Sortierung nicht erhalten/enthalten. Die Endfärbung der sortierten Menge ist gleich kontinuierlich wie die Startfärbung. Vielleicht meldet sich ja diesmal ein glücklicher Finder irgendeines (oder mehr als eines) Fehlers. Viel Spaß erneut oder weiterhin! Delphi-Laie Edit: Beide Quicksorts beschleunigt: Tausch nur noch nach Schlüsselvergleich. Damit vermischen beide Algorithmen die Elemente gleichgroßer Schlüssel auch nicht mehr unkontrolliert, sondern werden wenigstens „invers stabil“ (=bei Elementen gleichgroßer Schlüssel wird deren Reihenfolge invertiert). Edit 2: Borderstyle vom Sortierformular so geändert, daß es nunmehr ein echtes Fenster (also mit Rahmen) ist. Mit dem Setzen des Formstyles des Sortierformular auf fsStayOnTop sollen zudem die störenden Neuzeichnungen anzahlig zurückgedrängt werden. Edit 3: Swirlsort korrigiert (Farbinformation blieb im Verlaufe der Sortierung nicht erhalten). Edit 4: Subtilen Fehler bei der Bestimmung der maximalen Spalten- und Zeilenanzahl im Fenstermodus beseitigt (?). Funktionierte nicht richtig, nachdem das Formular 2 (zum Sortieren) schon mal visible war bzw. benutzt wurde. Edit 5: Insertionsort beschleunigt (zyklisches Verschieben anstatt häufigen Vertauschens). 2 weitere Insertionsorts hinzugefügt (Variante 3 zeigt ziemlich selten einen nicht reproduzierbaren Fehler). Das Sortierformular, sofern als Fenster benutzt (also mit Rahmen), behält nunmehr seine Position, zu der es verschoben wurde (vorher immer Bildschirmzentrierung desselben). Edit 6: Subtilen Fehler bei der Generierung der Startmenge „2 separate absteigende Teilmengen“ korrigiert. Dynamische Längenanpassung der (zu sortierenden) (Haupt-)Menge korrigiert. Edit 7: Anhänge gelöscht, weil beide Programmversionen verein(ig)t wurden - siehe vorherigen Beitrag. |
Zitat |
Delphi 2007 Enterprise |
#3
Eine schöne Sache , aber den Code solltest Du so nicht freigeben. Versuche mal, das Ganze mit OOP umzusetzen.
|
Zitat |
Delphi 12 Athens |
#4
Sehr schöne Idee!
Irgendwie fänd ich das ne tolle Sache, wenn man solche Projekte bewerten könnte. Sherlock
Oliver
|
Zitat |
|
#5
Finde ich sehr schön anschaulich, wobei ein sauberes OOP-Design bei der Programmierung noch schöner wäre.
- Ich finde das rahmenlose Design bei nicht bildschirmfüllender "Animation" etwas irritierend. - Der Bildaufbau ist manchmal etwas gestört (Streifen, Hintergrund "schimmert" durch). Klasse wäre es das ganze noch um etwas Theorie zu erweitern. Also eine Erklärung zu den Vor- und Nachteilen den Algorithmen und Funktionsweise und Einsatzfälle. Das könnte dann eine Art "Sortierkompendium" darstellen. |
Zitat |
Delphi 10.1 Berlin Starter |
#6
Danke für Eure positiven Rückmeldungen! Ich hoffe, daß die Quelltexte bis weit nach oben aufwärtskompatibel sind. Ich fand schon wieder etwas hinsichtlich einer kleinen Verbesserung, die ich wohl heute noch hochladen werde. Die flexible Anpassung der Arraylängen zur Laufzeit dürfte im übrigen eher Unfug sein, aber ich belasse sie, einmal erstellt, nun.
Zitat von alzaimar:
Eine schöne Sache , aber den Code solltest Du so nicht freigeben.
Zitat von alzaimar:
Versuche mal, das Ganze mit OOP umzusetzen.
Zitat von guidok:
Finde ich sehr schön anschaulich, wobei ein sauberes OOP-Design bei der Programmierung noch schöner wäre.
Zitat von guidok:
- Ich finde das rahmenlose Design bei nicht bildschirmfüllender "Animation" etwas irritierend.
Edit: Dazu habe ich anscheinend die Lösung gefunden, wird bei Erfolg recht bald hier neu hochgeladen.
Zitat von guidok:
- Der Bildaufbau ist manchmal etwas gestört (Streifen, Hintergrund "schimmert" durch).
Am besten, den Computer während des Sortierens in Ruhe lassen, keine externen Fensterhandhabungen o.ä., was irgendwo anders Windows irgendetwas an der Bildschirmgraphik „rummachen“ läßt.
Zitat von guidok:
Klasse wäre es das ganze noch um etwas Theorie zu erweitern. Also eine Erklärung zu den Vor- und Nachteilen den Algorithmen und Funktionsweise und Einsatzfälle. Das könnte dann eine Art "Sortierkompendium" darstellen.
|
Zitat |
Delphi 10.1 Berlin Starter |
#7
Nach diversen kleinen Fehlerbehebungen habe ich meinen Programmen nunmehr eine kleine funktionale Erweiterung spendiert: Beim Sortierformular änderte ich den Borderstyle so, daß es nunmehr ein echtes Fenster (also mit Rahmen) ist.
Wird die Anzahl der Zeilen und Spalten hinreichend klein gewählt, sodaß das Formular auch mit Rahmen in den Bildschirm paßt, dann wird der Fenstermodus automatisch, also immer zugeschaltet (was mir auch sympathischer ist). Ist das Sortierformular gleich groß oder nur unwesentlich kleiner als der Bildschirm, sodaß der Fensterrahmen eigentlich nicht mehr hinzupaßt, dann läßt sich der Fenstermodus jedoch erzwingen - was dann aber geringfügig zu Lasten der verfügbaren Spalten- und Zeilenanzahl und damit der Anzahl der zu sortierenden Elemente geht. Der (logischerweise rahmenlose) Vollbildmodus ist also weiterhin möglich. |
Zitat |
Delphi 10.1 Berlin Starter |
#8
So, zum (vorläufigen?) Finale die absolute Krönung: Die beiden (derzeit) schnellsten (allgemein anwendbaren) Sortieralgorithmen AVL- & B-Sort (vorgestellt von Peter Weigel auf Sortieralgorithmen(.de)) fügte ich in mein Programm ein!
Optisch sind diese zwar kein Hochgenuß/Leckerbissen, bedienen dafür aber alle Komplexitäts- und Geschwindigkeitsfanatiker. Schon die Visualisierung läßt erkennen, daß sie in einer anderen Liga als Heap-, Merge- und sogar Quicksort spielen und eher der Geschwindigkeit der speziellen Sortieralgorithmen bzw. Bucketsorts entsprechen. Auch an dieser Stelle danke ich dem Forum http://www.planet-quellcodes.de, dort speziell der Delphi/Kylix-Rubrik, wo das schon vor Jahren mal (erfolglos?!) thematisiert wurde, ich das deshalb dort wieder aufgriff und man mich bei der Portierung von C nach Objektpascal massiv unterstützte. |
Zitat |
Delphi 10.1 Berlin Starter |
#9
Sehr schöne Idee!
Irgendwie fänd ich das ne tolle Sache, wenn man solche Projekte bewerten könnte. Sherlock Wie gefällt es Dir / Euch nun? Es tat sich in der Zwischenzeit doch einiges an/mit diesem Programm, und nunmehr weiß ich keine weitere Verbesserung mehr (auch die Motivation ist erst mal wieder versiegt). Dieses ist zudem mein drittes Delphiprojekt, daß ich nach Lazarus portierte (=migrierte?). Es war, wie die beiden Male davor, ein mittleres Abenteuer. |
Zitat |
Delphi 12 Athens |
#10
Hi, immer noch ein sehr schönes und anschauliches Programm. Letztens tauchte bei YouTube ein Video zur Visualisierung von Sortierungen auf, das etwas zeigt, das mir irgendwie bei Dir fehlt: Ich sehe nicht wirklich wie die Elemente vertauscht werden. OK dafür sind sie ja eingefärbt, aber...schau Dir mal das Video an.
Aber genial viele Einstellmöglichkeiten, die ich noch ausprobieren muss. Sherlock
Oliver
|
Zitat |
Ansicht |
Linear-Darstellung |
Zur Hybrid-Darstellung wechseln |
Zur Baum-Darstellung wechseln |
ForumregelnEs ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.
BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus. Trackbacks are an
Pingbacks are an
Refbacks are aus
|
|
Nützliche Links |
Heutige Beiträge |
Sitemap |
Suchen |
Code-Library |
Wer ist online |
Alle Foren als gelesen markieren |
Gehe zu... |
LinkBack |
LinkBack URL |
About LinkBacks |