Entwickler-Ecke

Algorithmen, Optimierung und Assembler - MergeSort Problem--->prog läuft zwar, sortiert aber nicht?


fresh2k - Di 03.01.06 20:46
Titel: MergeSort Problem--->prog läuft zwar, sortiert aber nicht?
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



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


Horst_H - 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 - 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 - Mi 04.01.06 19:56

Hallo,

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


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 - Mi 04.01.06 21:29

Hallo!
werds nacher mal ausprobieren!
vielen dank schonmal!!!!


fresh2k - Do 05.01.06 10:35

:D :D :D ES GEHT!!!!!!!!! :D :D :D

danke danke danke!!!