Registriert seit: 11. Mär 2008
2 Beiträge
Turbo Delphi für Win32
|
Sortieren von Array of Record klappt nicht...
20. Mai 2009, 12:10
Hallo Leute,
ich habe folgende Datenstruktur:
Delphi-Quellcode:
TPath = array of TPoint;
TInd = Record
Path: TPath;
Dist: real;
BadDist: real;
end;
TPop = array of TInd;
und dazu folgenden Sortieralgorithmus:
Delphi-Quellcode:
//====================================================
// * BEGIN VON QUICKSORT * //
procedure quicksort(aUn2SortDaten0: TPop; 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].BadDist;
// ********************************************************* //
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: TPop; 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: TPop;
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: TPop; 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 * //
//====================================================
Allerdings sortiert dieser nicht! Das Array ist nach der Sortierung genauso wie vorher... Was mache ich falsch? (BTW: Der algorithmus stammt von hier: http://www.delphi-forum.de/topic_Fer...IG+_84652.html
|
|
Zitat
|