Welchen Algorithmus verwende ich, um 50 Zahlen mit möglichst wenig Vergleichen und Vertauschungen zu sortieren?

4 Antworten

Die anderen Antworten sind offensichtlich von Laien verfasst, und ich - als richtiger Profi - habe dir hier mal zwei sehr effiziente Sortieralgorithmen in Java implementiert:

http://pastebin.com/PCZ5R3Bq

randSort() würfelt die Elemente eines Arrays so lange durcheinander, bis sie sich zufällig in einer sortierten Reihenfolge befinden. Wenn man ganz ganz viel Glück hat, wird nur eine Iteration benötigt, und der Algorithmus ist demnach als "effizient" zu bezeichnen.

assumeSort() ist sogar noch schneller, da einfach angenommen wird, dass das Array von vornherein schon sortiert vorliegt, und andernfalls einfach eine Ausnahme geworfen wird. Dieser Algorithmus ist sehr sehr schnell, hat aber auch eine sehr hohe Fehleranfälligkeit.

Habe den obigen Code zwar nur mit 10 Arrayelementen getestet, aber er sollte natürlich auch mit deinen geforderten 50 Elementen funktionieren ... vorausgesetzt, du achtest nicht so genau auf die Rechenzeit. :)

Einfach den Code in "Main.java" speichern, und mit:

javac Main.java

... kompilieren, und danach testweise mit:

java Main one two three four five six seven eight nine ten

... ausführen!

Tja, dagegen kommen Bubblesort & Co nicht an.

Viel Spaß noch mit Java! :)

TeeTier  13.06.2015, 00:59

PS: Ich sehe gerade, dass es dir wohl nur um Zahlen und nicht um Strings geht ... aber das Prinzip ist ja im Grunde genommen das Gleiche. :)

0
Reyha24  13.06.2015, 08:11

Keine Hobbys? Dieses getrolle ist weder lustig, noch hilft es einem weiter. Effizient ist es jedenfalls nicht.

0
procoder42  13.06.2015, 08:24
@Reyha24

Na doch, es wurde nicht nach einer effizienten Laufzeit, sondern nach effizienz bezüglich der Vergleiche gefragt. Eine obere Schranke für den Worst Case gibt es halt nicht, theoretisch könnte der bis in alle Ewigkeit zufällig das Array "sortieren"

Und ich hielt mich immer für den einzigen, der auf die Idee mit dem zufälligen sortieren kam ^^.

1
TeeTier  13.06.2015, 11:31
@Reyha24

Ach komm ... das war ein Scherz! Fühl dich doch bitte nicht gleich angegriffen! :)

0
Reyha24  13.06.2015, 11:55
@TeeTier

Ich verstehe schon Spaß, aber als Laie durchschaut man das nicht & das ist hier das Problem :) Okay? :)

0
Reyha24  13.06.2015, 08:38

"und Vertauschungen" Gruß :)

0
procoder42  13.06.2015, 10:35
@Reyha24

Du weist aber schon, dass man da best und worst Case unterscheiden muss ? Im best Case hat man keine Vertauschung , aber einen Aufruf von .isSorted(). Das die Antwort jetzt nivht all zu ernst zu nehmen ist, ist klar; an sich hat er aber fachlich recht

1
Reyha24  13.06.2015, 11:59
@procoder42

Ja. Im best-case hat man keine Vertauschung. Aber im average-case und worst-case ist die Laufzeit bzw. Anzahl der Vertauschungen schrecklich :) Bei anderen Algorithmen hat man im best-case die gleiche Laufzeit bzw. Anzahl von Vertauschungen (0) (wenn man vorher auch so eine "isSorted"-Methode aufruft). Aber im average- und worst-case hat man dann eine deutlich bessere Laufzeit bzw. weniger Vertauschungen. Das einzige was an diesem Algorithmus gut ist, ist das man das Verfahren gut nachvollziehen kann. Gruß :)

0
procoder42  13.06.2015, 12:19
@Reyha24

Wie gesagt, die Antwort trollt auf recht subtile weise .... Aber das hat man als Fragen Steller davon, wenn man ungenau formuliert 

1

Es gibt keinen Algorithmus, der für alle Fälle optimal ist. Ich habe z.B. eine Tabelle, die ich sortiert benötige. Die Daten bekomme ich bereits sortiert aus der Datenbank. Nur: Die Datenbank sortiert die Umlaute anders, so wie der Anwender es normalerweise braucht, meine Tabelle muss aber binär korrekt sortiert sein. Die Wahrscheinlichkeit, dass es überhaupt Differenzen gibt, ist eher gering.

Nun kann ich einen Super-Sort in mein Programm einbinden, der völlig unterfordert ist, aber diesen Fall kann der viel geschmähte Bubble-Sort mit viel weniger Aufwand genauso gut erledigen. Insofern ist der Gedanke von TeeTier gar nicht so abwegig (ist halt ein Profi), dass die zu sortierende Tabelle schon sortiert sein kann und ganz einfache Algorithmen voll ausreichend sind.

Auch das dynamische Einfügen in eine bereits sortierte Tabelle (kommt häufig vor) ist so ein Fall. Man hängt das neue Element hinten dran und lässt z.B. einen Sort drüber laufen. Dazu braucht man auch keinen Super-Sort, es sei denn, diesen habe ich aus anderen Gründen schon im Programm.

Man muss auch berücksichtigen, dass manche sonst gut bewertete Sort-Algorithmen eine Art von Analyse durchführen, bevor sie mit dem eigentlichen Sortieren beginnen. Diese Rüstzeit ist bei kleinen Datenmengen nicht gerade von Vorteil.

Auf jeden Kochtopf passt ein Deckel, aber es gibt keinen Deckel, der auf jeden Kochtopf passt.

Google mal nach "bubblesort" dabei handelt es sich um einen Sortieralgorithmus der die Werte anhand ihrer Größe tauscht.

Mein7terAccount  12.06.2015, 13:01

Bubblesort gehört zu den schlechteste Sortieralgorithmen überhaupt :D

2
Unkreatiiiev  12.06.2015, 13:09
@Mein7terAccount

Ist aber recht simpel zu verstehen.

Außerdem maximal eine Laufzeit von O n^2. Ist also garnicht so langsam.

2
procoder42  12.06.2015, 14:34
@Unkreatiiiev

Sag mal, du hast dich nicht all zu sehr damit befasst, oder ? Bubblesort ist grauenhaft. Schau dir mal die Laufzeit von Quicksort oder Mergesort an : Im best Case n*log n ... Wer mit simpler Mathematik vertraut ist, sollte den Unterschied bemerken.

1
Unkreatiiiev  13.06.2015, 14:28
@procoder42

Trotzdem ist Bubblesort nicht langsam. Viele Algorithmen haben dieselbe Laufzeit.

0
Reyha24  12.06.2015, 13:17

O(n^2) ist grausam. Bubblesort wird häufig nicht mal als Sortieralgorithmus genannt.

1
Reyha24  13.06.2015, 17:43

O(n^2) im average-case ist langsam. O(n*log(n)) ist der Standard.

0

Ist der Zahlenbereich offen?