![]() |
Quck-Sort sortieren A und B
Ich habe folgendes sortier Problem:
Es geht um doppelte Dateien. Ich möchte 2 Werte mit Q-Sort sortieren. Der erste boolean Wert kann ziemlich häufig vorkommen. Der zweite integer Wert evtl. ein paar mal. Die Sortierreihenfolge ist erst boolean dann Integer. Das eine doppelte Datei vorhanden ist wird mit einem boolean Wert angezeigt. Diese bekomme ich auch wunderbar sortiert. Was ich nicht hinbekomme ist das die Dateien, die doppelt sind also von gleicher Länge dann auch oben und schön untereinander stehen. Ich könnte es mit Bubble machen, aber geht so was nicht auch mit Q-Sort) Logisch wäre eine >and< Verknüpfung, habe ich probiert (auch or) kommt allerdings nicht das heraus was ich will.
Code:
MFG
procedure _QuickSort(AHandle:THandle;TL:TList;Index:integer;SortStyle:TCustomSortStyle;SortOrder:boolean);
var S1, S2 : string; I1,I2 : int64; B1,B2 : boolean; procedure QSort(L,R,Typ:integer;Liste:TList); var I,J,M :longInt; function Verg(P1,P2:integer):shortint; begin result := 0; case SortStyle of cssAlphaNum : begin case Index of //Ist die Spalten aus dem z.B.ListViev 1 : begin S1 := AnsiLowerCase(PDateiListRec(Liste[P1])^._FileName); S2 := AnsiLowerCase(PDateiListRec(Liste[P2])^._FileName); end; 2 : begin S1 := AnsiLowerCase(PDateiListRec(Liste[P1])^._Erw0); S2 := AnsiLowerCase(PDateiListRec(Liste[P2])^._Erw0); end; end;//case Index if not SortOrder then begin if S1 > S2 then result := 1; if S1 < S2 then result := -1; end else begin if S1 > S2 then result := -1; if S1 < S2 then result := 1; end; end;//cssAlphaNum cssNumeric : begin case Index of //Ist die Spalten aus dem z.B.ListViev 3 : begin I1 := PDateiListRec(Liste[P1])^._Size; I2 := PDateiListRec(Liste[P2])^._Size; end; 4 : begin I1 := PDateiListRec(Liste[P1])^._CRC64Calc; I2 := PDateiListRec(Liste[P2])^._CRC64Calc; end; end;//case Index if not SortOrder then begin if I1 > I2 then result := 1; if I1 < I2 then result := -1; end else begin if I1 > I2 then result := -1; if I1 < I2 then result := 1; end; end;//cssNumeric cssBoolean : begin case Index of 0 : begin//_Duplikat B1 := PDateiListRec(Liste[P1])^._Duplikat; B2 := PDateiListRec(Liste[P2])^._Duplikat; I1 := PDateiListRec(Liste[P1])^._Size; I2 := PDateiListRec(Liste[P2])^._Size; end; 1 : begin B1 := PDateiListRec(Liste[P1])^._DateiError; B2 := PDateiListRec(Liste[P2])^._DateiError; end; 2 : begin B1 := PDateiListRec(Liste[P1])^._Geaendert; B2 := PDateiListRec(Liste[P2])^._Geaendert; end; end;//case Index if not SortOrder then begin if (B1 > B2) and (I1 > I2) then result := 1; if (B1 < B2) and (I1 < I2) then result := -1; end else begin if (B1 > B2) and (I1 > I2) then result := -1;//um diese Stelle geht es if (B1 < B2) and (I1 < I2) then result := 1; //um diese Stelle geht es end; end;//cssBoolean end;//SortStyle end;//Verg begin//QSort; try repeat I:=L; J:=R; M:=(L + R) shr 1; repeat while Verg(I,M) < 0 do inc(I); while Verg(J,M) > 0 do dec(J); if I <= J then begin _PListSwap(Liste,I,J); if I=M then M:=J else if J=M then M:=I; inc(I); dec(J); end; if GetAsyncKeystate(VK_ESCAPE) <> 0 then exit; until I > J; if L < J then QSort(L, J,Typ,Liste); L := I; until I >= R; except on E:Exception do begin TS_ErrorLog.Add('_QuickSort'); TS_ErrorLog.Add(E.ClassName+':'+E.Message); TS_ErrorLog.Add(RS_ErrorStrich); end; end; end; begin//_QuickSort SendMessage(AHandle,WM_QSORT_BEGIN,0,13); if TL.Count -1 < 0 then exit; QSort(0,TL.Count-1,Index,TL); SendMessage(AHandle,WM_QSORT_END,0,13); end; |
Re: Quck-Sort sortieren A und B
Ich denke mal, das im Falle (SortStyle = cssBoolean) AND (Index <>0) deine 'I1' und 'I2' gar nicht definiert sind.
|
Re: Quck-Sort sortieren A und B
Bei Index 0 sind sie Deffiniert, die anderen benötige ich z.Z. nicht. Und ich rufe Index 0 aud :wink:
0 : begin//_Duplikat B1 := PDateiListRec(Liste[P1])^._Duplikat; B2 := PDateiListRec(Liste[P2])^._Duplikat; I1 := PDateiListRec(Liste[P1])^._Size; I2 := PDateiListRec(Liste[P2])^._Size; |
Re: Quck-Sort sortieren A und B
Auch wenn ich denn Sinn deiner Vergleichsfunktion nicht so wirklich ganz verstehe: Wenn Du nach zwei Kriterien sortieren willst, dann mußt Du diese schon in die Vergleichsfunktion einbauen:
Code:
Ansonsten: erst alles nach Kriterium 1 sortieren und dann nur die Bereiche gleicher Werte nochmals mit Kriterium 2 sortieren. Wobei die erste Variante die einfachere sein dürfte.
// Pseudocode
Result := Krit1(Item1) > Krit1(Item2); if Result = 0 then Result := Krit2(Item1) > Krit2(Items); Grüße, Uli |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:58 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