AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Quck-Sort sortieren A und B

Ein Thema von Opa · begonnen am 30. Dez 2007 · letzter Beitrag vom 31. Dez 2007
Antwort Antwort
Benutzerbild von Opa
Opa

Registriert seit: 12. Jun 2003
107 Beiträge
 
Delphi 7 Enterprise
 
#1

Quck-Sort sortieren A und B

  Alt 30. Dez 2007, 18:38
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:
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;
MFG
Wenn man nicht weiß was man sucht, findet man auch mit Google nichts.
Bevor ich hier eine Frage stelle, wurde Google vorher befragt. Hinweise dieser Art kann man sich schenken. Im übrigen muss mir niemand antworten.
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#2

Re: Quck-Sort sortieren A und B

  Alt 30. Dez 2007, 19:20
Ich denke mal, das im Falle (SortStyle = cssBoolean) AND (Index <>0) deine 'I1' und 'I2' gar nicht definiert sind.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von Opa
Opa

Registriert seit: 12. Jun 2003
107 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: Quck-Sort sortieren A und B

  Alt 30. Dez 2007, 19:37
Bei Index 0 sind sie Deffiniert, die anderen benötige ich z.Z. nicht. Und ich rufe Index 0 aud
0 : begin//_Duplikat
B1 := PDateiListRec(Liste[P1])^._Duplikat;
B2 := PDateiListRec(Liste[P2])^._Duplikat;
I1 := PDateiListRec(Liste[P1])^._Size;
I2 := PDateiListRec(Liste[P2])^._Size;
Wenn man nicht weiß was man sucht, findet man auch mit Google nichts.
Bevor ich hier eine Frage stelle, wurde Google vorher befragt. Hinweise dieser Art kann man sich schenken. Im übrigen muss mir niemand antworten.
  Mit Zitat antworten Zitat
Benutzerbild von ULIK
ULIK

Registriert seit: 25. Sep 2006
Ort: Regensburg
427 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: Quck-Sort sortieren A und B

  Alt 31. Dez 2007, 09:10
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:
// Pseudocode
Result := Krit1(Item1) > Krit1(Item2);
if Result = 0 then
  Result := Krit2(Item1) > Krit2(Items);
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.

Grüße,
Uli
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:20 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