![]() |
Probleme beim sortieren
Hallo,
ich hab da ein kleines Problem mit dem SelectionSort-Algorithmus. Das Tut von Daniel hab ich mir durchgelesen. Es geht darum, folgende kleine Liste (in TListBox) zu sortieren:
Code:
Die Einträge sollen primär nach Bildgröße und innerhalb gleicher Größe nach Farbtiefe sortiert werden.
100 x 100 - 256 Farben
16 x 16 - 16 Farben 48 x 48 - 256 Farben 32 x 32 - 7 Farben 16 x 16 - 256 Farben 48 x 48 - 16 Farben 32 x 32 - 16 Farben 32 x 32 - 24 bpp 16 x 16 - 24 bpp 32 x 32 - 256 Farben 48 x 48 - 24 bpp Mein Algo sieht bisher so aus:
Delphi-Quellcode:
(Richtig, das mit der Farbtiefe hab ich noch nicht implementiert)
function SortList(List: TStrings): TStrings;
var i, j, min: Integer; Buffer : string; begin for i := 0 to List.Count - 2 do begin min := 0; for j := i + 1 to List.Count - 1 do if StrToInt(copy(List[j], 0, Pos(' ', List[j]) - 1)) < StrToInt(copy(List[min], 0, Pos(' ', List[min]) - 1)) then min := j; Buffer := List[i]; List[i] := List[min]; List[min] := Buffer; end; Result := List; end; Aufgerufen wird er so:
Delphi-Quellcode:
Der sortiert, aber nicht komplett:
procedure TForm1.ListBox1Click(Sender: TObject);
var List: TStringList; begin List := TStringList.Create; List.Assign(ListBox1.Items); Listbox1.Items.Assign(SortList(List)); end;
|
Re: Probleme beim sortieren
Herzlich willkommen in der Delphi-PRAXiS, Snuffi.
Vergleiche deinen Code mit der von mir korrigierten Fassung:
Delphi-Quellcode:
Freundliche Grüße vom marabu
function SortList(List: TStrings): TStrings;
var i, j, min: Integer; Buffer: String; begin for i := 0 to List.Count - 2 do begin min := i; // nicht immer 0 setzen for j := i + 1 to List.Count - 1 do if StrToInt(copy(List[j], 1, Pos(' ', List[j])-1)) // Copy() ab Position 1 < StrToInt(copy(List[min], 1, Pos(' ', List[min])-1)) then // ditto min := j; if min <> i then // tauschen wenn nötig begin Buffer := List[i]; List[i] := List[min]; List[min] := Buffer; end; end; Result := List; end; |
Re: Probleme beim sortieren
Hi marabu,
freundliche Grüße zurück... Der korrigierte Code scheint zu funktionieren... nein, der funktioniert!! ![]() ![]() ![]() ![]() ![]() Das mit min := i statt 0 hab ich übersehen... :wall: :wall: (<- Syncron-Head-Nutting :) ) Ich glaub, copy wär des egal ob du bei 0 oder 1 anfängst, bin mir aber net sicher. Und das bedingte Tauschen wär bei der Datenmenge auch nicht unbedingt nötig gewesen... Danke Mann!! |
Re: Probleme beim sortieren
Hi Leute,
ich habs jetzt (ganz) anders gemacht: Mit diesen Typen/Variablen...
Delphi-Quellcode:
...diese (hardgecodete) Liste...
type
TIconInfo = record Size : Word; BitCount: Byte; end; var IconInfos : array[Byte] of TIconInfo; IconCount : Integer;
Delphi-Quellcode:
...mit diesem Code sortieren:
IconInfos[0].Size := 100;
IconInfos[0].BitCount := 8; IconInfos[1].Size := 16; IconInfos[1].BitCount := 4; IconInfos[2].Size := 48; IconInfos[2].BitCount := 8; IconInfos[3].Size := 32; IconInfos[3].BitCount := 3; IconInfos[4].Size := 16; IconInfos[4].BitCount := 8; IconInfos[5].Size := 48; IconInfos[5].BitCount := 4; IconInfos[6].Size := 32; IconInfos[6].BitCount := 4; IconInfos[7].Size := 32; IconInfos[7].BitCount := 24; IconInfos[8].Size := 16; IconInfos[8].BitCount := 24; IconInfos[9].Size := 16; IconInfos[9].BitCount := 7; IconInfos[10].Size := 32; IconInfos[10].BitCount := 8; IconInfos[11].Size := 48; IconInfos[11].BitCount := 24; IconCount := 12;
Delphi-Quellcode:
function SortList(var IconList: array of TIconInfo): TStrings;
var i, j, min: Integer; SwBuffer : TIconInfo; List : TStringList; StrBuffer: string; begin List := TStringList.Create; for i := 0 to IconCount - 2 do // begin // Array sortieren min := i; // for j := i + 1 to IconCount - 1 do // if (IconList[j].Size shl 8 or IconList[j].BitCount) < (IconList[min].Size shl 8 or IconList[min].BitCount) then min := j; // if min <> i then // begin // SwBuffer := IconList[i]; // IconList[i] := IconList[min]; // IConList[min] := SwBuffer; // end; // end; // for i := 0 to IconCount - 1 do // begin // sortierte Liste ausgabefähig machen StrBuffer := IntToStr(IconList[i].Size) + ' x ' + IntToStr(IconList[i].Size) + ' - '; // (In StrngList umwandeln) case IconList[i].BitCount of // 0..8: StrBuffer := StrBuffer + IntToStr(Round(Power(2, IconList[i].BitCount))) + ' Farben'; // 24 : StrBuffer := StrBuffer + '24 bpp'; // else StrBuffer := StrBuffer + '?? Farben' // end; // List.Add(StrBuffer); // end; // Result := List; end;
Delphi-Quellcode:
Das Programm kann mit den Daten dies hier sortiert viel mehr anfangen als mit den Strings :) . Außerdem hab ich so alles auf einmal sortiert.
procedure TForm1.ListBox1Click(Sender: TObject);
begin Listbox1.Items.Assign(SortList(IconInfos)); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:17 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz