![]() |
Sortieren von Array of Record klappt nicht...
Hallo Leute,
ich habe folgende Datenstruktur:
Delphi-Quellcode:
und dazu folgenden Sortieralgorithmus:TPath = array of TPoint; TInd = Record Path: TPath; Dist: real; BadDist: real; end; TPop = array of TInd;
Delphi-Quellcode:
Allerdings sortiert dieser nicht! Das Array ist nach der Sortierung genauso wie vorher... Was mache ich falsch? (BTW: Der algorithmus stammt von hier:
//====================================================
// * 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 * // //==================================================== ![]() |
Re: Sortieren von Array of Record klappt nicht...
Ist nicht mehr ganz so dringend, ich habs anders gelöst (Alg. komplett neu geschrieben)... Wenn jemand dennoch eine Lösung hat, immer her damit...
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:13 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