Einzelnen Beitrag anzeigen

xaromz

Registriert seit: 18. Mär 2005
1.682 Beiträge
 
Delphi 2006 Enterprise
 
#6

Re: Bubblesort einer Listbox. Mit 3 Verknüfungen

  Alt 29. Nov 2005, 17:15
Hallo,

Dein Fehler liegt hier:
 if strtofloat(List.Items[j]) > strtofloat(List.Items[i]) then Du vergleichst ja immer die unsortierte Liste, da Du das Ergebnis erst am Ende wieder der Liste zuordnest. Bubblesort braucht aber eine sich langsam sortierende Liste.
Um das Problem mit der Geschwindigkeit zu lösen versuche mal folgendes:
Delphi-Quellcode:
procedure TForm1.Sort(List: TListBox);
var
  i, j: Integer;
begin
  Progressbar2.Position := 0;
  progressbar2.Max := Listbox2.Count - 1;
  ListBox1.Items.BeginUpdate;
  ListBox2.Items.BeginUpdate;
  ListBox3.Items.BeginUpdate;
  ListBox4.Items.BeginUpdate;
  for i := 0 to List.Items.Count - 1 do
  begin
    Progressbar2.Position := Progressbar2.Position + 1;
    for j := i + 1 to List.Items.Count - 1 do
    begin
      if List.Items[j] > List.Items[i] then
      begin
        Listbox1.Items.Exchange(i, j);
        Listbox2.Items.Exchange(i, j);
        Listbox3.Items.Exchange(i, j);
        Listbox4.Items.Exchange(i, j);
      end;
    end;
  end;
  ListBox1.Items.EndUpdate;
  ListBox2.Items.EndUpdate;
  ListBox3.Items.EndUpdate;
  ListBox4.Items.EndUpdate;
end;
Damit schaltest Du die Bildschirmaktualisierung aus, das beschleunigt ungemein. Außerdem solltest Du nicht BubbleSort verwenden, das ist so ziemlich das Langsamste was es gibt. Nimm lieber Quicksort. Ich hab mal ein Beispiel geschrieben:
Delphi-Quellcode:
procedure TForm1.SortQuick(List: TListBox);

  function Compare(S1, S2: String): Integer;
  begin
    // Negatives Ergebnis -> S1 ist kleiner
    // Positives Ergebnis -> S2 ist kleiner
    // Null -> Gleicher String
    Result := StrToInt(S1) - StrToInt(S2);
  end;

  procedure Exchange(I, J: Integer);
  begin
    // Hier wird getauscht
    ListBox1.Items.Exchange(I, J);
    ListBox2.Items.Exchange(I, J);
    ListBox3.Items.Exchange(I, J);
    ListBox4.Items.Exchange(I, J);
  end;

  procedure QuickSort(L, R: Integer);
  var
    I, J: Integer;
    S: String;
  begin
    repeat
      I := L;
      J := R;
      S := List.Items[(L + R) shr 1];
      repeat
        while Compare(List.Items[I], S) < 0 do
          Inc(I);
        while Compare(List.Items[J], S) > 0 do
          Dec(J);
        if I <= J then
        begin
          Exchange(I, J);
          Inc(I);
          Dec(J);
        end;
      until I > J;
      if L < J then
        QuickSort(L, J);
      L := I;
    until I >= R;
  end;

begin
  QuickSort(0, List.Items.Count - 1);
end;
Aufruf:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  // Update ausschalten
  ListBox1.Items.BeginUpdate;
  ListBox2.Items.BeginUpdate;
  ListBox3.Items.BeginUpdate;
  ListBox4.Items.BeginUpdate;

  // Sortieren
  SortQuick(ListBox1);

  // Update einschalten
  ListBox1.Items.EndUpdate;
  ListBox2.Items.EndUpdate;
  ListBox3.Items.EndUpdate;
  ListBox4.Items.EndUpdate;
end;
Die Funktion Compare kannst Du so anpassen, dass sie Deinen Bedürfnissen entspricht.

Gruß
xaromz
  Mit Zitat antworten Zitat