Autor |
Beitrag |
fresh2k
Hält's aus hier
Beiträge: 10
winxp
Delphi 5, HTML, CSS, ein bissl C
|
Verfasst: Di 03.01.06 20:46
Hallo alle zusammen!!
Ich habe ein Problem mit meinem MergeSort-Algorithmus.
Das Programm soll eine zufällige erstellste Stringgrid sortieren. Es läuft zwar ohne Fehler, aber es stehen dann nach dem Sortieren Zahlen da, von denen nie die Rede war.
Kann mir da jemand helfen?
Und noch eine andere Frage:
Was müsste ich schreiben, damit ich eine beliebige Anzahl von Zahlen ordnen kann??
Zur Info: Ich bin noch in der Schule und lerne das alles gerade.
Hier noch mein 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: 50: 51: 52: 53: 54:
| interface public Cols:integer; b: array[0..9] of integer;
implementation
procedure TForm1.MergeSort(links, rechts:integer); var i,j,k,mid:integer;
begin if (rechts-links>0) then begin mid := round ( (rechts+links) div 2 ); MergeSort(links, mid); MergeSort(mid+1, rechts); for i:=mid downto links do b[i] := StrToInt(sg1.cells[i,0]); for j:=mid+1 to rechts do b[rechts+mid+1-j] := StrToInt(sg1.cells[j,0]); for k:=links to rechts do begin if b[i]<b[j] then begin sg1.cells[k,0]:=IntToStr(b[i]); i:=i+1; end else begin sg1.cells[k,0]:=IntToStr(b[j]); j:=j-1; end; end; end end;
procedure TForm1.BmergeClick(Sender: TObject); var i:integer; begin cVGL:=0; cSwitch:=0; for i:=0 to (Cols-1) do b[i] := strtoint( sg1.cells[i,0] ); MergeSort(0,Cols-1); Ever.text:=IntToStr(cVGL); Etausch.text:=IntToStr(cSwitch); end; |
Danke im Voraus und MfG fresh2k
Moderiert von raziel: Code- durch Delphi-Tags ersetzt
Zuletzt bearbeitet von fresh2k am Mi 04.01.06 19:18, insgesamt 1-mal bearbeitet
|
|
Horst_H
      
Beiträge: 1654
Erhaltene Danke: 244
WIN10,PuppyLinux
FreePascal,Lazarus
|
Verfasst: Mi 04.01.06 10:10
Hallo,
was sortierst Du denn?
MergeSort(0,Cols-1);
Du sortierst die Spalten welcher Zeile, nur Zeile 0.
Ist es das was Du willst?
Du solltest Dir vielleicht spaeter ueberlegen, diese staendigen Inttostr und strtoint los zu werden.
Gruss Horst
|
|
fresh2k 
Hält's aus hier
Beiträge: 10
winxp
Delphi 5, HTML, CSS, ein bissl C
|
Verfasst: Mi 04.01.06 19:15
na das ist die erste zeile der StringGrid. halt von zelle 0 bis 9.
was anderes steht in der stringgrid nicht drin.
naja wie gesagt ich lerne das alles grade. und unser lehrer ist nicht in der lage den sachverhalt verstaendlich rüberzubringen. deshalb suche ich hier hilfe.
|
|
Horst_H
      
Beiträge: 1654
Erhaltene Danke: 244
WIN10,PuppyLinux
FreePascal,Lazarus
|
Verfasst: Mi 04.01.06 19:56
Hallo,
Schleifenindizes sind nach dem Schleifendurchlauf nicht definiert!!
also i,j Werte zuweisen.
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: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TForm1 = class(TForm) Button1: TButton; Memo1: TMemo; procedure MergeSort(links, rechts:integer); procedure Button1Click(Sender: TObject); private b: array[0..9] of integer; public end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.MergeSort(links, rechts:integer); var i,j,k,mid:integer;
begin if (rechts-links>0) then begin mid := (rechts+links) div 2 ; MergeSort(links, mid); MergeSort(mid+1, rechts); for i:=mid downto links do b[i] := StrToInt(Memo1.Lines[i]); for j:=mid+1 to rechts do b[rechts+mid+1-j] := StrToInt(Memo1.Lines[j]); i := links; j := rechts; for k:=links to rechts do begin if b[i]<b[j] then begin Memo1.Lines[k]:=IntToStr(b[i]); i:=i+1; end else begin Memo1.Lines[k]:=IntToStr(b[j]); j:=j-1; end; end; end end; procedure TForm1.Button1Click(Sender: TObject); var i : integer; begin memo1.lines.Clear; memo1.lines.Add('Original'); For i := 0 to 9 do memo1.lines.Add(inttostr(random(10000))); memo1.lines.Add('Sortiert'); For i := 0 to 9 do memo1.lines.Add(memo1.lines[i+1]); i := memo1.lines.count-1; mergesort(i-9,i); end;
end. |
Gruss Horst
|
|
fresh2k 
Hält's aus hier
Beiträge: 10
winxp
Delphi 5, HTML, CSS, ein bissl C
|
Verfasst: Mi 04.01.06 21:29
Hallo!
werds nacher mal ausprobieren!
vielen dank schonmal!!!!
|
|
fresh2k 
Hält's aus hier
Beiträge: 10
winxp
Delphi 5, HTML, CSS, ein bissl C
|
Verfasst: Do 05.01.06 10:35
|
|
|