unit Unit2;
// INFO QuickSort zum Sortieren eines Array of Records oder Arrays
// INFO bzw. zum Sortieren einer "Tabelle"/"Matrix" nach einer Spalte
// INFO Aufruf erfolg mit quicksort(ARRAYbezeichung,Sortierrichtung)
// INFO Bei TRUE wird aufsteigend a..z und bei FALSE absteigend z..a sortiert
// VORRAUSSETZUNG es muss einen Datentyp vom Typ 'TMyArrayOne' geben !
// VORRAUSSETZUNG dieser kann ein "ARRAY of Records" oder "ARRAY of ARRAYs of 'DatentypXY'" sein
// VORRAUSSETZUNG ES MÜSSEN ZWEI STELLEN IM CODE ANGEPASST WERDEN, DIESE BEREICHE SIND DURCH --> GEKENNZEICHENT
// VORRAUSSETZUNG Das ist zueinem die Angabe der Spalte, nach der sortiert werden soll.
// VORRAUSSETZUNG Und zum anderen die Verknüpfung mit der Unit wo der Datentyp 'TMyArrayOne' deklariert wurde
interface
uses
// --> Wo ist Datentyp 'TMyArrayOne' deklariert ???
Unit1;
var aSortVergleich:
array of Variant;
procedure quicksort(
var aUn2SortDaten0: TMyArrayOne; bSortierrichtung0:boolean);
procedure quicksort_teil_a(
var aUn2SortDaten1: TMyArrayOne; iLinksP1,iRechtsP1:integer);
function quicksort_teil_b(
var aUn2SortDaten2: TMyArrayOne; iLinksP2,iRechtsP2:integer):integer;
procedure quicksort_teil_c(
var aUn2SortDaten3: TMyArrayOne; iDatensatzzeiger1, iDatensatzzeiger2: integer);
implementation
procedure quicksort(
var aUn2SortDaten0: TMyArrayOne; bSortierrichtung0:boolean);
var iLinks0,iRechts0,i,j:integer;
begin
// Der erste Datensatz LINKS im Array ist auf Position X
iLinks0:=low(aUn2SortDaten0);
// Der letze Datensatz RECHTS im Array ist auf Position Y
iRechts0:=high(aUn2SortDaten0);
// Aufbau des Vergleichsarrays
setlength(aSortVergleich,length(aUn2SortDaten0));
for i:=iLinks0
to iRechts0
do
begin
// ********************************************************* //
// ** --> Angabe nach welcher Spalte sortiert werden soll ** //
aSortVergleich[i]:=aUn2SortDaten0[i].sWort;
// ********************************************************* //
end;
// ===========================================================
// * BEGINN DER SORTIERUNG - KEINE ÄNDERUNGEN MEHR NOTWENDIG *
//Durchführen der Sortierung
quicksort_teil_a(aUn2SortDaten0, iLinks0, iRechts0);
// es wurde jetzt von a..z sortiert, falls z..a gewünscht ist, geschieht das jetzt
if not bSortierrichtung0
then
begin
repeat
begin
quicksort_teil_c(aUn2SortDaten0, iLinks0, iRechts0);
iLinks0:=iLinks0+1;
iRechts0:=iRechts0-1;
end;
until not (iLinks0 < iRechts0);
end;
end;
// + Teilprozedure 1 von QuickSort +
procedure quicksort_teil_a(
var aUn2SortDaten1: TMyArrayOne; iLinksP1,iRechtsP1:integer);
var iTeiler:integer;
begin
if iLinksP1 < iRechtsP1
then
begin
iTeiler := quicksort_teil_b(aUn2SortDaten1, iLinksP1, iRechtsP1);
quicksort_teil_a(aUn2SortDaten1, iLinksP1, iTeiler-1);
quicksort_teil_a(aUn2SortDaten1, iTeiler+1, iRechtsP1);
end;
end;
// + Teilprozedure 2 von QuickSort +
function quicksort_teil_b(
var aUn2SortDaten2: TMyArrayOne; iLinksP2,iRechtsP2:integer):integer;
var iLinksTemp,iRechtsTemp:integer;
begin
iLinksTemp := iLinksP2;
// Starte mit j links vom Pivotelement
iRechtsTemp := iRechtsP2 - 1;
repeat
begin
// Suche von links ein Element, welches größer oder gleich dem Pivotelement ist
while ((aSortVergleich[iLinksTemp] <= aSortVergleich[iRechtsP2])
and (iLinksTemp < iRechtsP2))
do iLinksTemp:= iLinksTemp + 1;
// Suche von rechts ein Element, welches kleiner oder gleich dem Pivotelement ist
while ((aSortVergleich[iRechtsTemp] >= aSortVergleich[iRechtsP2])
and (iRechtsTemp > iLinksP2))
do iRechtsTemp:= iRechtsTemp - 1;
if iLinksTemp < iRechtsTemp
then quicksort_teil_c(aUn2SortDaten2, iLinksTemp, iRechtsTemp);
end;
until not(iLinksTemp < iRechtsTemp);
// solange iLinks an iRechts nicht vorbeigelaufen ist
// Tausche Pivotelement (daten[rechts]) mit neuer endgültigen Position (daten[i])
quicksort_teil_c(aUn2SortDaten2, iLinksTemp, iRechtsP2);
// gib die Position des Pivotelements zurück
result:=iLinksTemp;
end;
// + Teilprozedure 3 von QuickSort +
procedure quicksort_teil_c(
var aUn2SortDaten3: TMyArrayOne; iDatensatzzeiger1, iDatensatzzeiger2: integer);
var vHelp:Variant;
iTempDatensatzanzahl:integer;
begin
// Tauschen der beiden Vergleichswerte
vHelp:=aSortVergleich[iDatensatzzeiger1];
aSortVergleich[iDatensatzzeiger1]:=aSortVergleich[iDatensatzzeiger2];;
aSortVergleich[iDatensatzzeiger2]:=vHelp;
// Tauschen von zwei Datensätzen
iTempDatensatzanzahl:=length(aUn2SortDaten3);
setlength(aUn2SortDaten3,iTempDatensatzanzahl+1);
aUn2SortDaten3[iTempDatensatzanzahl]:=aUn2SortDaten3[iDatensatzzeiger1];
aUn2SortDaten3[iDatensatzzeiger1]:=aUn2SortDaten3[iDatensatzzeiger2];
aUn2SortDaten3[iDatensatzzeiger2]:=aUn2SortDaten3[iTempDatensatzanzahl];
setlength(aUn2SortDaten3,iTempDatensatzanzahl);
end;
// * ENDE VON QUICKSORT * //
//====================================================
end.