Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi QuickSort: Zahlen wie gezählt sortieren (https://www.delphipraxis.net/117775-quicksort-zahlen-wie-gezaehlt-sortieren.html)

Nils_13 24. Jul 2008 16:36


QuickSort: Zahlen wie gezählt sortieren
 
Hi,

ich benutze folgende QuickSort-Funktion:
Delphi-Quellcode:
procedure QuickSort(var Arr : TDynItemArray; Start, Stop : Integer);
var Left, Right, Mid : Integer;
    Pivot           : String;
    Tmp             : TItem;
begin
  Left := Start;
  Right := Stop;
  Mid  := (Start+Stop) div 2;
  Pivot := LowerCase(Arr[Mid].Name);
  repeat
    while LowerCase(Arr[Left].Name) < Pivot do
      inc(Left);
    while Pivot < LowerCase(Arr[Right].Name) do
      dec(Right);
    if Left <= Right then
    begin
      Tmp := Arr[Left];
      Arr[Left] := Arr[Right];
      Arr[Right] := Tmp;

      inc(Left);
      dec(Right);
    end;
  until
    Left > Right;

  if Start < Right then
    QuickSort(Arr, Start, Right);
  if Left < Stop then
    QuickSort(Arr, Left, Stop);
end;
Sie funktioniert mit Strings einwandfrei. Allerdings möchte ich anstelle von so etwas...
Delphi-Quellcode:
8
81
82
83
84
85
86
87
88
89
9
90
91
92
93
94
95
96
...
...lieber die gewohnte Weise:
Delphi-Quellcode:
8
9
...
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
...
Wie könnte man das realisieren ? Ich habe überhaupt keine Idee.

Apollonius 24. Jul 2008 16:40

Re: QuickSort: Zahlen wie gezählt sortieren
 
Du musst TDynItemArray von Strings auf Zahlen umstellen und entsprechend die .Name-Referenzen ändern. Die geänderte Sortierung wird dann automatisch durch die Operatoren erledigt.

Nils_13 24. Jul 2008 16:42

Re: QuickSort: Zahlen wie gezählt sortieren
 
Und wie soll man das umstellen bzw. was genau meinst Du mit umstellen ?

Apollonius 24. Jul 2008 16:46

Re: QuickSort: Zahlen wie gezählt sortieren
 
Anscheinend verwaltet das TDynItemArray Elemente vom Typ TItem, welcher wiederum Strings kapselt, auf welche mit TItem.Name zugegriffen wird. Wenn du Zahlen sortieren willst, solltest du TItem so ändern, dass Zahlen und nicht Strings verwaltet werden - oder du deklarierst direkt TItem als Alias für Integer oder Cardinal. Das .Name im Code der QuickSort-Funktion etnfällt dann.

Nils_13 24. Jul 2008 17:08

Re: QuickSort: Zahlen wie gezählt sortieren
 
Ich lese einen Ordner aus und will diesen sortiert ausgeben. Ich bekomme also nichts außer Strings. Das sind die eigenen Typen:
Delphi-Quellcode:
type
  TItem = record
    Pfad, Name, fTyp, Typ, Alter, DirSR : String;
    Index, ImageIndex     : Integer;
  end;
  TDynItemArray = Array of TItem;

Apollonius 24. Jul 2008 17:12

Re: QuickSort: Zahlen wie gezählt sortieren
 
Und wie willst du dann Namen sortieren, die nicht nur aus Ziffern bestehen? Das ist nicht allzu intuitiv für den Nutzer.

omata 24. Jul 2008 17:15

Re: QuickSort: Zahlen wie gezählt sortieren
 
dann eben nicht.

Apollonius 24. Jul 2008 17:21

Re: QuickSort: Zahlen wie gezählt sortieren
 
Das ist nicht optimal, da sich dann die Ergebnisse je nach Sortieralgorithmus unterschieden. Insbesondere ist die so definierte Relation nicht transitiv, denn '13' < '2a' < '3' < '13'.

alzaimar 24. Jul 2008 18:03

Re: QuickSort: Zahlen wie gezählt sortieren
 
Erstelle einfach eine Funkton 'Compare', die zwei Namen miteinander so vergleicht, wie Du es gerne hättest.

Hawkeye219 24. Jul 2008 18:19

Re: QuickSort: Zahlen wie gezählt sortieren
 
Hallo Nils,

in der CodeLib findest du Quelltexte zum Thema "Natürliche" Sortierung. Vielleicht helfen die weiter.

Gruß Hawkeye


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:32 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