Entwickler-Ecke
Algorithmen, Optimierung und Assembler - Zahlen sortieren
THF - Mi 27.04.05 10:38
Titel: Zahlen sortieren
Hallo,
wie kann ich verschiedene Zahlen oder Variablen der Größe nach sortieren ?
Die größte Zahl soll oben stehen , die kleinste Zahl ganz unten .
Gruß
THF
Moderiert von
Christian S.: Topic aus CLX / Delphi Language (Object-Pascal) verschoben am Mi 27.04.2005 um 11:00
csigg - Mi 27.04.05 10:41
Such hier oder generell im Netz (Wikipedia,google,..) mal mal nach Quicksort,Shakersort, Bubblesort,...
csigg - Mi 27.04.05 11:46
@ tino: hätt ich auch so gemacht, weiss aber nicht wie ich so nen Link rein krieg :D
THF - Mi 27.04.05 17:01
Hallo,
welches ist am schnellsten ?
Ich muß nur ungefähr 30 - 40 verschiedene werte sortieren.
Gruß
Thf
Stefan.Buchholtz - Mi 27.04.05 17:26
THF hat folgendes geschrieben: |
Hallo,
welches ist am schnellsten ?
Ich muß nur ungefähr 30 - 40 verschiedene werte sortieren.
Gruß
Thf |
Wenn das nur so wenige sind, spielt die Performance wohl kaum eine Rolle - nimm Bubblesort, der ist am einfachsten. Quicksort ist schneller, aber auch komplizierter.
Stefan
THF - Mi 27.04.05 21:16
Hallo,
ich habe gelesen , daß Shell-Sort am schnellsten ist.
Stimmt das ?
Gruß
THF
wulfskin - Mi 27.04.05 21:24
THF hat folgendes geschrieben: |
Hallo,
ich habe gelesen , daß Shell-Sort am schnellsten ist.
Stimmt das ?
Gruß
THF |
Gewöhnlich ist Quicksort am schnellst. Aber wie gesagt, ist bei dieser Menge der Algorithmus völlig egal. Nimm das, was dir am einfachsten erscheint, zum Beispiel auch Sortieren durch Ersetzen (wie heisst das Fachwort?).
Gruß Hape!
csigg - Do 28.04.05 08:18
Ich würde auch Sortieren durch Ersetzen oder Sortieren durch Ausweilen/Einfügen (weiss nicht mehr genau wie das heiß, gibts aber bei google und wikipedia genug dazu).
Auf schnelligkeit brauchst bei so kleiner Anzahl von Werten noch nicht achten, nimm einfach den Einfachsten, der dir selbst am besten gefällt, den du selbst am besten anpassen kannst.
Gausi - Do 28.04.05 09:11
Shellsort ist nicht am schnellsten. Quicksort ist in der Regel sehr schnell, kann in Einzelfällen aber genau so lange brauchen, wie die langsamen Verfahren Bubblesort oder Sortieren durch Auswahl.
Ein weiteres sehr schnelles Verfahren (aber auch komplizierter zu beschreiben und zu proggen) ist Heapsort. Zu allen Verfahren dürftest du aber Implementierungen hier im Forum finden.
Sinnvoll ist eine Auswahl des Sortierverfahrens aber erst ab 1000 Elementen oder so. Davor merkt man keinen Unterschied...
THF - Fr 29.04.05 08:50
hallo,
ich habe auch gelesen, daß Shell-Sort am schnellsten ist.
Ich muß zwar nur 30 -40 Werte sortieren ,
da die Procedure jedoch öfter aufgerufen wird, spielt die Geschwindigkeit doch eine
Rolle.
Ich glaube ich versuch es mit Shell-Sort.
Gruß
THF
Gausi - Fr 29.04.05 09:18
Gut, wenn ihr meint...Ich habe ja die Vorlesung Informatik3, in der ausführlich Sortierverfahren besprochen werden, nur 3mal korrigiert oder als Übungsgruppenleiter mitgemacht.
Shellsort ist nicht schlecht. Aber bitte sorge dann dafür, dass du als Inkremente alle Zahlen der Form 2^p*3^q nimmst. Dann kann man nämlich nachweisen, dass Shellsort eine Laufzeit von O(N*log^2(N)) hat. Allein diese Zahlen zu finden ist aber schon ein großer Programmieraufwand.
Quicksort dagegen ist im Mittel O(N*log(N)), und Heapsort auch im schlechtesten Fall O(N*log(N)).
Nimmt man hinzu, dass es zu Quicksort ungefähr drölftausend Implementierungen auch hier im Forum gibt... nun ja. Ist deine Sache. :roll:
THF - Fr 29.04.05 18:33
Hallo,
ich habe folgenden Code für Shell-Sort gefunden.
Ich blicke allerdings nicht durch wie ich das auf meine Strukturvariable
Variable[B].wert anwende.
Könnt Ihr mir da helfen ?
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| procedure ShellSort(var a: array of real); var bis,i,j,k : longint; h : real;
begin bis := high(a); k := bis shr 1; While k > 0 do begin For i := 0 To bis - k do begin j := i; While (j >= 0) And (a[j] > a[j + k]) do begin h := a[j]; a[j]:= a[j + k]; a[j + k] := h; dec(j,k); end; end; k := k shr 1; end; End; |
Gruß
THF
retnyg - Fr 29.04.05 18:43
was genau ist in Variable[B].wert?
ich vermute mal das ist ein record irgendeines typs
THF - Fr 29.04.05 19:08
Hallo,
Variable[B].wert ist ein Record.
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| Type TVariable = array [0..1000] of record ... ... Wert :Real; end; |
Gruß
THF
retnyg - Fr 29.04.05 19:24
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| procedure ShellSort(var a: tvariable); var bis,i,j,k : longint; h : real;
begin bis := high(a); k := bis shr 1; While k > 0 do begin For i := 0 To bis - k do begin j := i; While (j >= 0) And (a[j].wert > a[j + k].wert) do begin h := a[j].wert; a[j].wert:= a[j + k].wert; a[j + k].wert := h; dec(j,k); end; end; k := k shr 1; end; End |
so werden allerdings nur die werte sortiert. willst du den ganzen array umsortieren, musst du deinen record typisieren:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31:
| Type TmyRecord = record ... ... wert: real; end; TVariable = array [0..1000] of TmyRecord;
....
procedure ShellSort(var a: tvariable); var bis,i,j,k : longint; h : tmyrecord;
begin bis := high(a); k := bis shr 1; While k > 0 do begin For i := 0 To bis - k do begin j := i; While (j >= 0) And (a[j].wert > a[j + k].wert) do begin h := a[j]; a[j]= a[j + k]; a[j + k] := h; dec(j,k); end; end; k := k shr 1; end; End; |
so sollte es gehen, ist aber nicht getestet.
THF - Sa 30.04.05 00:16
Hallo retnyg,
Danke für die Hilfe.
Ich muß das erst noch ausprobieren .
Gruß
THF
THF - Mo 02.05.05 09:34
Hallo,
wie kann ich zusätzlich noch weitere Strukturvariablen desselben Records umsortieren.
zum Beispiel:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| Type TVariable = array [0..1000] of record ... ... Wert :Real; Wert2:Integer; Wert3:integer; end; |
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23:
| procedure ShellSort(var a: tvariable); var bis,i,j,k : longint; h : real;
begin bis := high(a); k := bis shr 1; While k > 0 do begin For i := 0 To bis - k do begin j := i; While (j >= 0) And (a[j].wert > a[j + k].wert) do begin h := a[j].wert; a[j].wert:= a[j + k].wert; a[j].wert2:=a[j+k].wert2; a[j].wert3:=a[j+k].wert3; a[j + k].wert := h; dec(j,k); end; end; k := k shr 1; end; End |
Gibt es noch eine andere Möglichkeit
ohne den Record zu typisieren ?
Gruß
THF
retnyg - Mo 02.05.05 12:29
THF hat folgendes geschrieben: |
Gibt es noch eine andere Möglichkeit ohne den Record zu typisieren ?
|
was ist daran so furchtbar ??
THF - Mo 02.05.05 21:57
Hallo,
ich habe das inzwischen hinbekommen.
Danke
Gruß
thf
Fabian W. - Mo 02.05.05 22:05
Hallo! Ich hab mir den Thread jeztzt net genau durchgelesen, aber ich hätte das die Zahlen in eien Combobox reingesteckt sortet auf true gesetzt und wieder abgerufen. Ich hab's nicht ausproobiert, wäre aber meien erste Idee gewesen.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!