Autor Beitrag
fresh2k
Hält's aus hier
Beiträge: 10

winxp
Delphi 5, HTML, CSS, ein bissl C
BeitragVerfasst: 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


ausblenden volle Höhe 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:
50:
51:
52:
53:
54:
interface
  public
    Cols:integer;   
        //cols ist die anzahl der spalten der Stringrid
        //diese Zahl sollte dann variiert werden können
        //in diesem falle is cols=10
    b: array[0..9of integer;
//...

implementation



procedure TForm1.MergeSort(links, rechts:integer);
var i,j,k,mid:integer;

begin
  if (rechts-links>0then
  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 // then
      else
       begin
         sg1.cells[k,0]:=IntToStr(b[j]);
         j:=j-1;
       end// else
    end// for
   end // then
end




procedure TForm1.BmergeClick(Sender: TObject);
var i:integer;
begin
cVGL:=0;
cSwitch:=0;
 for i:=0 to (Cols-1do 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 user profile iconraziel: Code- durch Delphi-Tags ersetzt


Zuletzt bearbeitet von fresh2k am Mi 04.01.06 19:18, insgesamt 1-mal bearbeitet
Horst_H
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1654
Erhaltene Danke: 244

WIN10,PuppyLinux
FreePascal,Lazarus
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 10

winxp
Delphi 5, HTML, CSS, ein bissl C
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1654
Erhaltene Danke: 244

WIN10,PuppyLinux
FreePascal,Lazarus
BeitragVerfasst: Mi 04.01.06 19:56 
Hallo,

Schleifenindizes sind nach dem Schleifendurchlauf nicht definiert!!
also i,j Werte zuweisen.

ausblenden volle Höhe 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:
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
    { Private-Deklarationen }
     b: array[0..9of integer;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.MergeSort(links, rechts:integer);
var i,j,k,mid:integer;

begin
  if (rechts-links>0then
  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 // then
      else
       begin
         Memo1.Lines[k]:=IntToStr(b[j]);
         j:=j-1;
       end// else
    end// for
   end // then
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 Threadstarter
Hält's aus hier
Beiträge: 10

winxp
Delphi 5, HTML, CSS, ein bissl C
BeitragVerfasst: Mi 04.01.06 21:29 
Hallo!
werds nacher mal ausprobieren!
vielen dank schonmal!!!!
fresh2k Threadstarter
Hält's aus hier
Beiträge: 10

winxp
Delphi 5, HTML, CSS, ein bissl C
BeitragVerfasst: Do 05.01.06 10:35 
:D :D :D ES GEHT!!!!!!!!! :D :D :D

danke danke danke!!!