Entwickler-Ecke
Algorithmen, Optimierung und Assembler - Sortieren eines Stringgrids
EvA - So 05.06.05 16:36
Titel: Sortieren eines Stringgrids
Hallo,
ich möchte 30 Zahlen, die ich untereinander in einem Stringgrid stehen habe, ihrer Größe nach sortiert und im selben Stringgrid wieder ausgegeben haben. Wie muss ich dieses eingeben. Ich habe es schon mit Schleifen versucht und mich auch schon versucht in alle möglichen Internetseiten reinzulesen, habe die Sortierverfahren jedoch nicht verstanden. Wäre nett, wenn mir jemand ein Bsp. geben könnte und es vielleicht auch kurz erklärt. Danke
EvA
Narses - So 05.06.05 16:42
Moin!
Zeig doch mal deinen Code, den du bisher hast. Andernfalls läuft es ja darauf hinaus, dir das Programm zu schreiben. :wink: Und das ist hier nicht ganz so gern gesehen... :D
Ansonsten gibt es hier haufenweise Beiträge zum Thema "Sortieren", einfach mal die Forum-Suche bemühen.
cu
Narses
EvA - So 05.06.05 18:40
Hallo Narses, das habe ich bis jetzt Zustande gebracht. Die innere Schleife soll die Zahlen immer tauschen, wenn die zweite größer ist als die erste, und die äußere Schleife die innere Schleife immer wieder wiederholen, wobei ich auch nich genau weiss, wie lange ich das machen muss...na ja, hier mal das "Programm", wie gesagt mit 30 Zahlen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| procedure TForm1.sortieren; var zeile,durchgaenge:integer; speicher: real; begin durchgaenge:=0; REPEAT zeile:=-1; REPEAT zeile:=zeile+1; IF stringgrid2.Cells[0,zeile]<stringgrid2.Cells[0,zeile+1] THEN begin speicher:=StrToFloat(stringgrid2.cells[0,zeile]); stringgrid2.cells[0,zeile]:=stringgrid2.cells[0,zeile+1]; stringgrid2.cells[0,zeile+1]:=FloatToStr(speicher); end UNTIL zeile=29; durchgaenge:=durchgaenge+1; UNTIL durchgaenge=1000;
end; |
Moderiert von
raziel: Code- durch Delphi-Tags ersetzt.
Delete - So 05.06.05 18:53
Das normale StringGrid kann nicht so einfach sortieren. Entweder nimmst du einen Listview oder das TMS StringGrid.
Narses - So 05.06.05 20:54
Moin!
EvA hat folgendes geschrieben: |
das habe ich bis jetzt Zustande gebracht. Die innere Schleife soll die Zahlen immer tauschen, wenn die zweite größer ist als die erste, und die äußere Schleife die innere Schleife immer wieder wiederholen, wobei ich auch nich genau weiss, wie lange ich das machen muss... |
Na, ist doch schonmal was. Schau dir mal
diesen [
http://www.delphi-forum.de/viewtopic.php?p=197199#197199] Thread an, da habe ich schonmal BubbleSort entwickelt. Versuch mal, das auf deinen Code zu "übertragen".
Wenn´s nicht klappt, das Ergebnis hier präsentieren, dann geht´s weiter.
cu
Narses
EvA - So 05.06.05 21:45
@Narses: So, habe das Programm nochmal ein wenig verbessert, das mit dem Dreieckstausch habe ich ja auch so, bei mir kommt jetzt sogar schon eine Reihenfolge heraus, wenn ich das sortier, aber das Programm sortiert zB die Zahlen 1,400,334,3,2222,20,41,10,60 leider nur wie folgt:
60
400
41
334
3
2222
20
10
1
irgendwie sortiert das Programm die Zahlen nur nach der vordersten Zahl :cry:
Hier noch der Quellcode:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| procedure TForm1.sortieren; var zeile,durchgang,speicher:integer; begin durchgang:=30; zeile:=-1; REPEAT zeile:=-1; durchgang:=durchgang-1; REPEAT zeile:=zeile+1; IF stringgrid2.Cells[0,zeile]<stringgrid2.Cells[0,zeile+1] THEN begin speicher:=StrToInt(stringgrid2.cells[0,zeile]); stringgrid2.cells[0,zeile]:=stringgrid2.cells[0,zeile+1]; stringgrid2.cells[0,zeile+1]:=IntToStr(speicher); end UNTIL zeile=durchgang; UNTIL durchgang=0;
end; |
EvA
Moderiert von
Tino: Code- durch Delphi-Tags ersetzt.
EvA - So 05.06.05 21:49
Noch kurz zur Erklärung:
Jetzt soll das Programm einmal die größte Zahl "nach vorne verschieben", sie danach dann nich mehr benutzen, deshalb die Variable "durchgang" und dann den nächsten Durchlauf starten, bis wieder das größte für die zweite Zeile rauskommt.
Vielleicht kann man meine neuen Überlegungen ja nachvollziehen :wink:
EvA
Narses - So 05.06.05 23:58
Moin!
EvA hat folgendes geschrieben: |
aber das Programm sortiert zB die Zahlen ... leider nur wie folgt: |
Das liegt daran, dass du einen Vergleich auf Zeichenkettenbasis machst, und da ist das nun mal so. :wink:
Du könntest das z.B. so korrigieren:
Delphi-Quelltext
1:
| IF StrToInt(stringgrid2.Cells[0,zeile]) < StrToInt(stringgrid2.Cells[0,zeile+1]) |
Ist aber nicht sonderlich effektiv. Sinnvoller wäre es, wenn du ein Feld mit den Werten füllst und auch sortierst, und nur für die Bildschirmausgabe Werte in das StringGrid einträgst.
Deine "Schleifenkonstruktion" ist auch etwas "abenteuerlich" :wink: Schau dir doch bitte nochmal genau mein Beispiel in dem von mir angegebenen Thread an, vielleicht solltest du deine Schleifen etwas dahingehend "verbessern".
cu
Narses
EvA - Mo 06.06.05 20:14
Hallo Narses,
ich habe mir jetzt nochmal das Beispiel für das Sortieren von Dir angeguckt. Habe es jetzt auch erstmal mit Namenssortierung wie es auch Method_Man versucht hat, dies ist jetzt dabei rausgekommen, leider funktioniert es noch nicht :(
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| procedure TForm1.Button2Click(Sender: TObject); var zaehler,Nmax,index:integer; hilf:string; begin Nmax:=4; zaehler := Nmax -1; repeat index := 1; repeat if ( stringgrid1.cells[index,0] > stringgrid1.cells[index+1,0] ) then begin hilf := stringgrid1.cells[index,0]; stringgrid1.cells[index,0] := stringgrid1.cells[index+1,0]; stringgrid1.cells[index+1,0] := hilf; end; index := index +1; until (index > zaehler); zaehler := zaehler +1; until (zaehler <= 0); end; |
EvA
Narses - Di 07.06.05 09:48
Moin!
Immerhin schonmal ein Ergebnis. Allerdings hast du noch drei Fehler im Code:
1. Du hast zaehler erhöht, statt herabzuzählen, das gibt dann eine ziemlich lange Schleife... :wink:
2. Du hast Spaltenindex 0 genommen, das sind normalerweise die Beschriftungen.
3. Du hast Spalte und Zeile in der StringGrid-Indizierung vertauscht.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| procedure TForm1.Button1Click(Sender: TObject); const SORT_COL = 1; var zaehler,Nmax,index: Integer; hilf:string; begin Nmax:=4; zaehler := Nmax -1; repeat index := 1; repeat if ( stringgrid1.cells[SORT_COL,index] > stringgrid1.cells[SORT_COL,index+1] ) then begin hilf := stringgrid1.cells[SORT_COL,index]; stringgrid1.cells[SORT_COL,index] := stringgrid1.cells[SORT_COL,index+1]; stringgrid1.cells[SORT_COL,index+1] := hilf; end; index := index +1; until (index > zaehler); zaehler := zaehler -1; until (zaehler <= 0); end; |
Ich habe mal diesen Code daraus gemacht und bei mir funktoniert es.
Spezialaufgabe: :wink:
Die Laufweiten der Schleifen sind doch bekannt. Stell also den Algorithmus auf FOR-Schleifen um. Wenn du noch ganz gewagt optimieren willst, dann kannste auch einen Bool (z.B. swapped: Boolean) vor jedem inneren Schleifenlauf auf FALSE setzen und auf TRUE, wenn du Elemente tauschst. Wenn swapped nach einem inneren Lauf immer noch FALSE ist, biste fertig und kannst auch die äußere Schleife verlassen.
cu
Narses
//EDIT: mir fällt grad auf, dass du ja evtl. die Daten zeilenweise im StringGrid haben könntest. Dann ist "Fehler 3" natürlich keiner. :wink: Ich habe die Daten untereinander gesetzt, so dass man besseren Überblick hat.
Narses - Mi 08.06.05 16:18
Moin!
Hier noch die Lösung der letzten "Spezialaufgabe"; für den Fall, dass es jemanden interessiert. :wink:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| procedure TForm1.Button1Click(Sender: TObject); const SORT_COL = 1; var i,j: Integer; hilf: String; swapped: Boolean; begin for i := StringGrid1.RowCount-2 downto 1 do begin swapped := FALSE; for j := 1 to i do if ( StringGrid1.Cells[SORT_COL,j] > StringGrid1.Cells[SORT_COL,j+1] ) then begin hilf := StringGrid1.Cells[SORT_COL,j]; StringGrid1.Cells[SORT_COL,j] := StringGrid1.Cells[SORT_COL,j+1]; StringGrid1.Cells[SORT_COL,j+1] := hilf; swapped := TRUE; end; if (NOT swapped) then Break; end; end; |
cu
Narses
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!