Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Sortierverfahren (Quicksort/shellsort/??)
Skittles - Sa 30.08.03 13:02
Titel: Sortierverfahren (Quicksort/shellsort/??)
Also, mein Problem ist, ich soll 100 zufallig erzeugte Zahlen in 100 versiedene Araays einlesen(das hab ich schon)
dann soll ich aber (PROBLEM!!) diese 100 Araays nach der größe der zugeordneten Zahlen sortieren und diese dann in einer Tabelle ausgeben, das in der Tabelle ausgeben würd ich auch grad noch hinbekommen, ich weiß aber leider nicht, wie man ARRAYS sortiert, da ich das noch nicht im unterricht hatte und mein buch auch nicht so perfekt viel dazu ausspuckt!
Ich wär also froh, wenn mir einer von euch das ma etwas näher bringe könnte!!
Thx
Taurin - Sa 30.08.03 14:25
a) Das Ding heißt Array und nicht Araay
b) Ich bin mir ziemlich sicher, dass du nicht 100 Arrays hast,
sondern eins mit 100 Elementen. Weist du überhaupt, was
ein Array genau ist?
c) Ich würde nen Bubblesort machen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| var arr :array[1..100] of integer; a, b, tmp :integer; begin for a := 1 to 100 do for b := a + 1 to 100 do if arr[a] > arr[b] then begin tmp := arr[a]; arr[a] := arr[b]; arr[b] := tmp; end; end; |
Das ist die einfachste Variante, ein Array zu sortieren, ohne dazu
ein neues Array anzulegen. Aber leider auch eine der langsamsten.
Skittles - Sa 30.08.03 14:35
Titel: Falsch verstanden
Also, ich hab das alles auf die schnlle und total genervt geschieben, weil das halt alles nicht geht!
ich meinen nen array mit 100 elementen, aber der soll auch ggf. 500000Elemente bekommen können, deshalb sollte man das möglichst nicht mit bubblesort machen, weil der is dann ja in 10 stunden nich fertig!!
Naja, dauert halt irrelang!
Ich weiß auch was ein array is (glaub ich zumindest)
Aber was ich nicht weiß wie ich das sortier!!! und ich finde nur immer so allgemeine sachen wie z.B. Quicksort, aber ich weiß einfach nicht, wie ich das mit arrays mach und so, hatte das halt noch nicht!!
BITTE HELFT MIR!!!!
THX
Skittles - Sa 30.08.03 14:44
Titel: Hilft nicht wirklich!
Also, auf der Seite war ich schon einmal, dadrüber hab ich immerhin schon mal den Code dafür gefunden, mein problem ist aber, wir bekomme ich es hin, das er dadurch, die 100 (bzw. biszu 500000)Elemente meines Arrays damit in die richtige reihenforge bringt?
sodass ich sie danach einfach nur in meiner tabelle ausgeben muss?
kann mir dabei jemand helfen? Denn der allgemeine Code hilft mit dabei nicht so sehr viel weiter!
MFG
FeG - Sa 30.08.03 14:45
Hallo,
erstmal enthält das Beispiel von Taurin einen ziemlich üblen Fehler: Wenn das Array in der letzten Schleife angekommen ist (a=100), dann wird b am Ende 200 !!! und arr[200] gibt's net, viel Spaß mit der Zugriffsverletzung!
Ein richtiges Beispiel für den Sortieralgorithmus gibt's
hier [
http://www.tipps.delphi-source.de/objectpascal/tut20000924-1.shtml]...
Wenn dir der aber zu langsam ist, mal Google mit "Quicksort", "Shellsort" oder ähnlichem nerven...
MfG,
FeG
//edit: Wie man an den Delphi-Demos (Threads) sehen kann, braucht Bubblesort für 114 Einträge weniger als eine Sekunde... Das lässt sich doch verkraften oder? Ansonsten musst du dich halt durch Shellsort oder Quicksort oder einen anderen "durchbeißen"
Christian S. - Sa 30.08.03 15:02
Zitat: |
Also, auf der Seite war ich schon einmal, dadrüber hab ich immerhin schon mal den Code dafür gefunden, mein problem ist aber, wir bekomme ich es hin, das er dadurch, die 100 (bzw. biszu 500000)Elemente meines Arrays damit in die richtige reihenforge bringt? |
Wenn ich das jetzt mal etwas provokativ fragen darf: was glaubst, was die Codes auf dieser Seite machen? Eier zählen :?:
Die Prozedur zum Sortieren habe ich 1:1 von der Seite genommen, daher habe ich sie im Quelltext nicht nochmal ausführlich drin.
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:
| zahl : Array of Integer;
implementation
{$R *.dfm}
Procedure Quicksort (l,r: integer);
var i,j,Mitte,Merke : Integer;
begin
end;
procedure TForm1.Button1Click(Sender: TObject); VAR i : INteger; begin Randomize; SetLength(zahl, 500); for i:=0 TO High(zahl) do zahl[i]:=Random(Length(zahl));
Quicksort(0,High(zahl)); ListBox1.Clear; for i:=0 TO High(zahl) do ListBox1.Items.Add(IntToStr(zahl[i])); end; |
MfG
Peter
Skittles - Sa 30.08.03 15:24
Titel: versucht!
ich habe versucht es jetzt auf mein programm zuzuschneiden, aber leider zeigt er mir nun bei der ausgabe nur noch nullen an!!!
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: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49:
| Procedure TFAnwendung.Quicksort (l,r: integer);
var i,j,Mitte,Merke : Integer;
begin i:=l; j:=r; Mitte:=Zahlen[(l+r) div 2]; repeat while Zahlen[i]<Mitte do Inc(i); while Mitte<Zahlen[j] do Dec(j); if i<=j then begin Merke:=Zahlen[i]; Zahlen[i]:=Zahlen[j]; Zahlen[j]:=Merke; Inc(i); Dec(j); end; until i>j; if l<j then QuickSort (l,j); if i<r then Quicksort (i,r); end;
procedure TFAnwendung.BsortiertClick(Sender: TObject); var i,k,z,s :integer;
begin A:= strtoint (EAnzahl.text); While i < A do begin i:= i+1; Zahlen[i]:= Random (A); end;
Quicksort(0,High(zahlen)); k:=1; While A>k do begin for z:= 0 to 28 do for s:= 0 to 6 do begin SGvorgabe.Cells[s,z]:= inttostr (Zahlen[k]); k:=k+1; end; end; end; |
ich weiß nicht woran es ligt und ob ihr mir so helfen könnt, aber versucht es bitte!!!
Moderiert von
Christian S.: Code- durch Delphi-Tags ersetzt.
Christian S. - Sa 30.08.03 16:29
Also, hier ein paar Sachen, die nicht unbedingt etwas mit dem Problem zu tun haben müssen, aber hilfreich sein könnten.
(1) Die Variable i wird nicht initialisiert
(2) hast Du Randomize aufgerufen?
(3) bei der Ausgabe startest Du mit k bei 1, jedoch beginnt das Array (nehme ich mal an) bei 0. Wenn es nicht bei Null, sondern bei 1 beginnt, musst Du das bei dem Aufruf von Quicksort noch ändern.
(4) Wenn A größer als 29*7 ist, dann werden die ersten Zellen wieder überschrieben
So, mehr fällt mir erst einmal nicht auf. Vielleicht hilft etwas davon, wenn nicht, dann melde Dich nochmal.
MfG
Peter
//Edit: Könntest Du demnächst statt den Code- die Delphi-Tags verwenden?
Taurin - So 31.08.03 01:39
FeG hat folgendes geschrieben: |
erstmal enthält das Beispiel von Taurin einen ziemlich üblen Fehler: Wenn das Array in der letzten Schleife angekommen ist (a=100), dann wird b am Ende 200 !!! und arr[200] gibt's net, viel Spaß mit der Zugriffsverletzung!
Ein richtiges Beispiel für den Sortieralgorithmus gibt's hier [http://www.tipps.delphi-source.de/objectpascal/tut20000924-1.shtml]...
|
Ich seh da keinen üblen Fehler. Wie soll b bei 200 ankommen, wenn
die for-Schleife ein
to 100 als Begrenzung enthällt ???? Der von
dir gepostete Code führt übringens pro Arrayelement (minus eins) ein überflüssigen Vergleich aus: Es wird loop2 mit loop initialisiert, das erste
if der inneren
Schleife vergleicht also zwei identische Arrayelemente. Grober Schönheits-
fehler !
Und wenn wir beim Haarespalten sind:
Mein Code hat auch einen kleinen Schönheitsfehler, einen Überflüssigen
durchlauf der äußeren Schleife: Beim letzten durchlauf sieht die innere
Schleife so aus:
for b := 101 to 100 -- und das wird natürlich abgebrochen. b wird dann
auch bestimmt nicht 200 :P
(Funktionieren tut er, und das besser als deiner, FeG !)
FeG - So 31.08.03 10:20
Taurin hat folgendes geschrieben: |
Ich seh da keinen üblen Fehler. Wie soll b bei 200 ankommen, wenn die for-Schleife ein to 100 als Begrenzung enthällt ???? |
Oh, ja, sorry vielmals, hatte ich überlesen :roll:
Nichts für ungut...
MfG,
FeG
Christian S. - So 31.08.03 12:54
Trotzdem würde ich versuchen, bei später mal 500000 Elementen einen Quicksort ans Laufen zu bekommen.
Taurin - So 31.08.03 14:02
Peter Lustig hat folgendes geschrieben: |
Trotzdem würde ich versuchen, bei später mal 500000 Elementen einen Quicksort ans Laufen zu bekommen. |
Da wollen wir auch gar nicht wiedersprechen :) Skittles erstes Posting
war bloß ein wenig konfus, da hab ich ihm erstmal das einfachste
vorgeschlagen.
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!