Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Problem mit Bubbesort (https://www.delphipraxis.net/5117-problem-mit-bubbesort.html)

Luckie 24. Mai 2003 16:27


Problem mit Bubbesort
 
So, ich habe für meine Datnebank einen Bubbelsort implementiert. Nur irgendwie macht er nicht so ganz, dass was er soll. Er sortiert nur bis zu Hälfte (Wenn er es tut. Die ersten datensätze sind noch sortiert.), und ab der Hälfte sind dann alle Datensätze identisch. Also so sieht das dann aus:
Zitat:

aa
bb
cc
dd
dd
dd
Ich benutze die Implementation von Daniel aus der Tutorialsparte.
Delphi-Quellcode:
procedure SwapIt(Record1, Record2: Trecord);
var
  TempRecord: Trecord;
begin
  TempRecord := Record1;
  Record1 := Record2;
  Record2 := TempRecord;
end;

procedure Sort;
var
  MyTypedFile : TTypedFile;
  Record1, Record2 : TRecord;
  s, s1, s2: String;
  i, j: Integer;
begin
  MyTypedFile := TTypedFile.Create(CutFilename(ParamStr(0))+'\'+DATAFILENAME);
  try
    for i := MyTypedFile.GetRecordsCount-1 downto 1 do
    begin
      for j := 2 to i do
      begin
        Record1 := MyTypedFile.GetRecord(j-1);
        Record2 := MyTypedFile.GetRecord(j);
        s1 := CreateLVCaption(j-1);
        s2 := CreateLVCaption(j);
        if s1 > s2 then
        begin
          SwapIt(Record1, Record2);
          MyTypedFile.ModifyRecord(Record1, j-1);
          MyTypedFile.ModifyRecord(Record2, j);
        end;
      s := Format('Datensätze werden sortiert: %d ...', [i]);
      SendDlgItemMessage(hApp, IDC_STATBAR, SB_SETTEXT, 1, Integer(@s[1]));
      ProcessMessages(hApp);
      end;
    end;
  finally
    MyTypedFile.Free;
    s := '';
    SendDlgItemMessage(hApp, IDC_STATBAR, SB_SETTEXT, 1, Integer(@s[1]));
  end;
end;
Ich sitze schon den ganzen Tag davor und finde den Fehler nicht.

Daniel 24. Mai 2003 16:48

Hallo Luckie,

ich sitze gerade leider nicht am richtigen Rechner, aber vielleicht solltest Du das Problem in zwei Teile teilen.

Das Grundgerüst des Bubblesort sieht ja wie folgt aus:

Delphi-Quellcode:
Procedure BubbleSort;
var i,j : Integer;
Begin
  For i:= N downto 1 Do
    For j:= 1 To i Do
      If (Data[j-1] > Data[j]) Then SwapValues( j-1, j );
End;
Ich habe ja fast den verdacht, dass Deine Wrapperklasse da irgendwo einen Index durcheinanderbringt.
Wenn ich am richtige PC bin, schaue ich mir mal Deinen Code an, aber so allgemein würde ich erstmal raten, die Vertauschungen in beispielsweise einem Memo zu loggen, so dass Du Schritt für Schritt siehst, was da vertauscht wird.

Luckie 24. Mai 2003 16:50

Den Verdacht hab eich auch, dass ich den Fehler an der falschen Stelle suche.

Luckie 24. Mai 2003 17:35

Ok. Habs gefunden. In meinem Wrapper hat alles gestimmt, ich habe ihn nur falsch angewendet.
Delphi-Quellcode:
procedure Sort;
var
  MyTypedFile : TTypedFile;
  Record1, Record2 : TRecord;
  s, s1, s2: String;
  i, j: Integer;
begin
  MyTypedFile := TTypedFile.Create(CutFilename(ParamStr(0))+'\'+DATAFILENAME);
  try
    for i := MyTypedFile.GetRecordsCount-1 downto 1 do
    begin
      for j := 2 to i do
      begin
        Record1 := MyTypedFile.GetRecord(j-1);
        Record2 := MyTypedFile.GetRecord(j);
        s1 := CreateLVCaption(j-1);
        s2 := CreateLVCaption(j);
        if s1 > s2 then
        begin
          SwapIt(Record1, Record2);
          MyTypedFile.ModifyRecord(Record1, Record2.Index);
          MyTypedFile.ModifyRecord(Record2, Record1.Index);
        end;
      s := Format('Datensätze werden sortiert: %d ...', [i]);
      SendDlgItemMessage(hApp, IDC_STATBAR, SB_SETTEXT, 1, Integer(@s[1]));
      ProcessMessages(hApp);
      end;
    end;
  finally
    MyTypedFile.Free;
    s := '';
    SendDlgItemMessage(hApp, IDC_STATBAR, SB_SETTEXT, 1, Integer(@s[1]));
  end;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:18 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz