Squirrelsort
- Projekt
- Bei der Vorbereitung zur Abschlussprüfung für meine Schule bin ich über eine Aufgabe gestolpert:
- Bitte lösen Sie folgendes Problem mit Pseudocode ...
- Einen Sortieralgorithmus implementieren Sie selbst.
- Au weia. Das Problem selbst war recht trivial, aber einen Bubblesort mal eben aus dem Ärmel schütteln?
-
Vor allem wenn man es gewohnt ist immer
sorted()
zu verwenden... - Idee
- Ich bastel mir jetzt mal einen Bubblesort zusammen, um das mal wirklich zu verstehen.
-
Und um möglichst wenig schummeln zu können habe ich mich für
C++
entschieden. - Umsetzung
-
Als erstes schreibt man sich ein
makefile
um mitclang
vernünftig reden zu können. - Danach ein paar Funktionen um Arrays am Display darzustellen, sowie mit Zufallszahlen zu befüllen.
- Jetzt geht es an den eigentlichen Sortieralgorithmus: Erstmal einen Bubblesort.
- Nachdem man ein bisschen aufgeräumt hat, fängt man an im Web rumzuklicken..
- Da gibt es doch noch viel mehr...
- Umfang
- Letztendlich habe ich eine ganze Menge Sortieralgorithmen implementiert:
- Ausgabe
- Das Programm generiert in der jetzigen Form folgende Ausgabe:
-
input data: [ 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 ] (ok) - bubble: [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 ] (ok) - comb: [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 ] (ok) - heap: [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 ] (ok) - insert: [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 ] (ok) - merge: [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 ] (ok) - quick: [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 ] (ok) - select: [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 ] (ok) - shell: [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 ] input data: [ 0, -1, -2, -3, -4, -5, -6, -7, -8, -9, -10, -11, -12, -13, -14, -15 ] (ok) - bubble: [ -15, -14, -13, -12, -11, -10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0 ] (ok) - comb: [ -15, -14, -13, -12, -11, -10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0 ] (ok) - heap: [ -15, -14, -13, -12, -11, -10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0 ] (ok) - insert: [ -15, -14, -13, -12, -11, -10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0 ] (ok) - merge: [ -15, -14, -13, -12, -11, -10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0 ] (ok) - quick: [ -15, -14, -13, -12, -11, -10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0 ] (ok) - select: [ -15, -14, -13, -12, -11, -10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0 ] (ok) - shell: [ -15, -14, -13, -12, -11, -10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0 ] input data: [ 36, -91, -39, 71, 23, -66, 78, -67, -72, 96, 58, -16, -58, 9, 73, -55 ] (ok) - bubble: [ -91, -72, -67, -66, -58, -55, -39, -16, 9, 23, 36, 58, 71, 73, 78, 96 ] (ok) - comb: [ -91, -72, -67, -66, -58, -55, -39, -16, 9, 23, 36, 58, 71, 73, 78, 96 ] (ok) - heap: [ -91, -72, -67, -66, -58, -55, -39, -16, 9, 23, 36, 58, 71, 73, 78, 96 ] (ok) - insert: [ -91, -72, -67, -66, -58, -55, -39, -16, 9, 23, 36, 58, 71, 73, 78, 96 ] (ok) - merge: [ -91, -72, -67, -66, -58, -55, -39, -16, 9, 23, 36, 58, 71, 73, 78, 96 ] (ok) - quick: [ -91, -72, -67, -66, -58, -55, -39, -16, 9, 23, 36, 58, 71, 73, 78, 96 ] (ok) - select: [ -91, -72, -67, -66, -58, -55, -39, -16, 9, 23, 36, 58, 71, 73, 78, 96 ] (ok) - shell: [ -91, -72, -67, -66, -58, -55, -39, -16, 9, 23, 36, 58, 71, 73, 78, 96 ] input data: [ -823, -800, -326, -213, -415, -765, -926, -409, -997, -877, -290, 844, -302, -121, 614, -842 ] (ok) - bubble: [ -997, -926, -877, -842, -823, -800, -765, -415, -409, -326, -302, -290, -213, -121, 614, 844 ] (ok) - comb: [ -997, -926, -877, -842, -823, -800, -765, -415, -409, -326, -302, -290, -213, -121, 614, 844 ] (ok) - heap: [ -997, -926, -877, -842, -823, -800, -765, -415, -409, -326, -302, -290, -213, -121, 614, 844 ] (ok) - insert: [ -997, -926, -877, -842, -823, -800, -765, -415, -409, -326, -302, -290, -213, -121, 614, 844 ] (ok) - merge: [ -997, -926, -877, -842, -823, -800, -765, -415, -409, -326, -302, -290, -213, -121, 614, 844 ] (ok) - quick: [ -997, -926, -877, -842, -823, -800, -765, -415, -409, -326, -302, -290, -213, -121, 614, 844 ] (ok) - select: [ -997, -926, -877, -842, -823, -800, -765, -415, -409, -326, -302, -290, -213, -121, 614, 844 ] (ok) - shell: [ -997, -926, -877, -842, -823, -800, -765, -415, -409, -326, -302, -290, -213, -121, 614, 844 ] input data: [ -4586, -6474, 3483, -9694, -963, 6604, -1012, 2676, 8453, -2115, -459, -1230, 3181, -801, 8572, -5436 ] (ok) - bubble: [ -9694, -6474, -5436, -4586, -2115, -1230, -1012, -963, -801, -459, 2676, 3181, 3483, 6604, 8453, 8572 ] (ok) - comb: [ -9694, -6474, -5436, -4586, -2115, -1230, -1012, -963, -801, -459, 2676, 3181, 3483, 6604, 8453, 8572 ] (ok) - heap: [ -9694, -6474, -5436, -4586, -2115, -1230, -1012, -963, -801, -459, 2676, 3181, 3483, 6604, 8453, 8572 ] (ok) - insert: [ -9694, -6474, -5436, -4586, -2115, -1230, -1012, -963, -801, -459, 2676, 3181, 3483, 6604, 8453, 8572 ] (ok) - merge: [ -9694, -6474, -5436, -4586, -2115, -1230, -1012, -963, -801, -459, 2676, 3181, 3483, 6604, 8453, 8572 ] (ok) - quick: [ -9694, -6474, -5436, -4586, -2115, -1230, -1012, -963, -801, -459, 2676, 3181, 3483, 6604, 8453, 8572 ] (ok) - select: [ -9694, -6474, -5436, -4586, -2115, -1230, -1012, -963, -801, -459, 2676, 3181, 3483, 6604, 8453, 8572 ] (ok) - shell: [ -9694, -6474, -5436, -4586, -2115, -1230, -1012, -963, -801, -459, 2676, 3181, 3483, 6604, 8453, 8572 ] input length: 64 (ok) - bubble: 45800 (ok) - comb: 12000 (ok) - heap: 51600 (ok) - insert: 10100 (ok) - merge: 21700 (ok) - quick: 193300 (ok) - select: 16400 (ok) - shell: 30400 input length: 128 (ok) - bubble: 178000 (ok) - comb: 26000 (ok) - heap: 39100 (ok) - insert: 34300 (ok) - merge: 38600 (ok) - quick: 20300 (ok) - select: 68500 (ok) - shell: 24600 input length: 256 (ok) - bubble: 1102700 (ok) - comb: 56000 (ok) - heap: 97900 (ok) - insert: 109000 (ok) - merge: 77100 (ok) - quick: 40500 (ok) - select: 196400 (ok) - shell: 57300 input length: 512 (ok) - bubble: 1629200 (ok) - comb: 126800 (ok) - heap: 185700 (ok) - insert: 427700 (ok) - merge: 178900 (ok) - quick: 88700 (ok) - select: 700500 (ok) - shell: 131200 input length: 1024 (ok) - bubble: 8501400 (ok) - comb: 296100 (ok) - heap: 407900 (ok) - insert: 1708400 (ok) - merge: 343800 (ok) - quick: 187500 (ok) - select: 3683300 (ok) - shell: 357700 input length: 2048 (ok) - bubble: 35942700 (ok) - comb: 683700 (ok) - heap: 921300 (ok) - insert: 12688500 (ok) - merge: 761800 (ok) - quick: 410300 (ok) - select: 12900200 (ok) - shell: 852900 input length: 4096 (ok) - bubble: 135837800 (ok) - comb: 1438200 (ok) - heap: 1948400 (ok) - insert: 37952300 (ok) - merge: 1761300 (ok) - quick: 1538600 (ok) - select: 52090200 (ok) - shell: 2136500
- Der obere Teil zeigt das zu sortierende Array, sowie das Ergebnis an.
- Anfangs absteigend positive bzw. negative Zahlen, dann Zufallszahlen zwischen ± 99, ± 999 und ± 9999.
- Einfach nur um sicher zu stellen, dass korrekt sortiert wird.
- Im unteren Teil werden Arrays in den Längen von 64 bis 4096 mit Zufallszahlen ± 9999 sortiert.
- Dabei wird die Zeit gestoppt - somit lassen sich die Algorithmen untereinander vergleichen.
- Fazit
- Bubblesort ist in allen Tests immer mit Abstand am langsamsten.
- Quicksort macht seinem Namen alle Ehere! Leider nicht bei kurzen Arrays, bei langen aber umso mehr.
- Ganz interessant sind noch Combsort, sowie Insertionsort.
Sortieralgorithmen, von Hand.
- Erstellt
- 12.07.2018 - 11:57:30
- Editiert
- 25.03.2019 - 21:06:56
- Tags
- C++