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