![]() |
AW: Quicksort-Rätsel
Ja, da bin ich sicher.
Und: Mit dem Insertion-Sort, der ja dieselbe Vergleichs-Funktion benutzt, klappt es ohne Probleme. |
AW: Quicksort-Rätsel
Hmm, okay, auf den zweiten Blick:
Delphi-Quellcode:
Fehlt da nicht jeweils eine Abbruchbedingung gegen das Überschreiten der Array-Grenzen?
while Less(tStart, 0) do Inc(tStart);
while Less(0, tStop) do Dec(tStop); Edit: Außerdem:
Delphi-Quellcode:
aData[0] := aData[(tStart + tStop) DIV 2];
Da wird das erste Element ja einfach überschrieben. Wenn dann müsstest du die beiden Elemente vertauschen. Oder du lässt dieses Implementierungsdetail einfach weg und speicherst das Pivot-Element in einer lokalen Variable zwischen. |
AW: Quicksort-Rätsel
Zitat:
Ist zwar mächtig unsauber, aber das 0-Element wird offensichtlich nicht benutzt. Aus diesem Grund sollte auch die Abbruchbedingung erfüllt sein, da in dem 0-Element das Pivot-Element steht, und spätestens wenn die Schleife diese erreicht, bricht sie ab. |
AW: Quicksort-Rätsel
Das gilt aber nur für die eine Richtung, oder? :gruebel:
Und überhaupt: Fehlt da nicht irgendwie das „Herz“ von Quicksort, nämlich, dass die Elemente, die kleiner sind als das Pivot-Element, auf die eine Seite und alle anderen Elemente auf die andere Seite gepackt werden? Je länger ich auf diesen Code draufschaue, desto unklarer wird er mir. |
AW: Quicksort-Rätsel
>>Fehlt da nicht irgendwie das „Herz“ von Quicksort ...<<
Das passiert m. E. hier:
Delphi-Quellcode:
Mit der 0 wird der Pivot-Record referenziert, der in dem Array-Element 0 enthalten ist.
while Less(tStart, 0) do Inc(tStart);
while Less(0, tStop) do Dec(tStop); |
AW: Quicksort-Rätsel
Ich habe den Fehler gefunden - wie so oft lag er dort, wo man am wenigsten sucht:
Schuld war der Rückgabewert der Funktion 'GetArtistSurname', welche nicht alle Datensätze bis zum Ende durchlaufen und daher in einigen Fällen einen leeren String zurückgegeben hat. Vielen Dank für Eure Bemühungen, das Brett vor meinem Kopf zu entfernen!!! |
AW: Quicksort-Rätsel
Zitat:
Wie auch immer, freut mich, dass du den Fehler trotzdem gefunden hast. |
AW: Quicksort-Rätsel
Zitat:
|
AW: Quicksort-Rätsel
Nachtrag:
Warum der Insertion Sort aber trotz der fehlerhaften Funktion das richtige Ergebnis liefert, habe ich bislang noch nicht verstanden:
Delphi-Quellcode:
Er durchläuft zwar alle Datensätze bis zum Ende, aber benutzt halt dieselbe Funktion ...
procedure tdlgMain.SortData;
var I: Word; J: Word; begin for I := 1 to TotalRecs do begin J := I; aData[0] := aData[I]; while (J > 0) and (Less(0, J - 1)) do begin aData[J] := aData[J - 1]; Dec(J); end; aData[J] := aData[0]; end; end; |
AW: Quicksort-Rätsel
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:17 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