Stabilität des Quicksort-Partitionierungsansatzes
Folgendes Quicksort Partitionierung-Algorithmus Ergebnis in einer stabilen Art (d.h. muss es beibehalten der relativen position von Elementen mit gleichen Werten):
partition(A,p,r)
{
x=A[r];
i=p-1;
for j=p to r-1
if(A[j]<=x)
i++;
exchange(A[i],A[j])
exchang(A[i+1],A[r]);
return i+1;
}
Kommentar zu dem Problem - Öffnen
Was meinst du mit stabil?
es bedeutet, dass, wenn zwei Elemente haben denselben Schlüssel ist, wenn zwei Schlüssel sind equall dann pflegt Sie Ihre orignal bestellen??
Welche Sprache soll das sein? Es scheint Rechtschreib-und Klammer/bracket-Fehler (zusammen mit irreführenden Einrückungen im code, sowie Rechtschreib-und Grammatikfehler in deinem text.
InformationsquelleAutor der Frage mawia | 2009-08-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es einen Fall, in dem Sie Ihre Partitionierungs-Algorithmus wird ein swap, ändert sich die Reihenfolge der Werte gleich. Hier ist ein Bild, das hilft zeigen, wie Ihr in-place-Partitionierung-Algorithmus arbeitet:
Marschieren wir durch jeden Wert mit dem index j, und wenn der Wert, den wir sehen, ist kleiner als die partition Wert, wir hängen Sie an das Licht-Grau subarray durch den Austausch mit dem element, das unmittelbar rechts von der Licht-Grau subarray. Die Licht-Grau subarray enthält alle Elemente, die <= der partition-Wert. Schauen wir uns nun an, sagen wir, Stufe (c) betrachten Sie den Fall, in dem drei 9 sind in den Anfang der weißen zone, gefolgt von einer 1. Das heißt, wir sind etwa um zu überprüfen, ob die 9 <= die partition Wert. Schauen wir uns die ersten 9 und sehen, dass es nicht <= 4, so lassen wir es an Ort und Stelle, und März j nach vorne. Schauen wir uns die nächsten 9 und sehen, dass es nicht <= 4, so dass wir auch lassen Sie es in Platz, und März j nach vorne. Wir verlassen auch den Dritten 9. Platz. Schauen wir uns jetzt die 1 und sehen, dass es kleiner ist als die partition, so dass wir vertauschen es mit dem ersten 9. Dann bis zum Ende des Algorithmus wir die swap-partition Wert mit dem Wert i+1, die zweiten 9. Jetzt haben wir abgeschlossen die partition-Algorithmus, und die 9, die ursprünglich Dritte ist jetzt ersten.
InformationsquelleAutor der Antwort Rose Perrone
Jeglicher Art umgewandelt werden können, um eine stabile Sortierung, wenn Sie bereit sind, fügen Sie eine zweite Taste. Der zweite Schlüssel sollte etwas sein, das zeigt die ursprüngliche Reihenfolge, wie eine Sequenz-Nummer. In Ihrem Vergleich-Funktion, wenn der erste Schlüssel gleich sind, verwenden Sie die zweite Taste.
InformationsquelleAutor der Antwort Mark Ransom
Einer Sortierung ist stabil, wenn die ursprüngliche Reihenfolge gleicher Elemente nicht ändern. Dein Algorithmus ist nicht stabil, da es-swaps gleiche Elemente.
Wenn es nicht, dann ist es immer noch nicht stabil sein:
Haben Sie zwei Elemente mit dem Sortierschlüssel "5". Wenn Sie vergleichen, element #2 (5) und #5 (3) aus irgendeinem Grund, dann die 5-würde ausgetauscht werden mit 3, somit gegen den Vertrag von einer stabilen Sorte. Dies bedeutet, dass die Wahl der pivot-element nicht helfen, Sie müssen auch sicherstellen, dass das kopieren von Elementen zwischen den Partitionen nie kehrt die ursprüngliche Reihenfolge.
InformationsquelleAutor der Antwort Aaron Digulla
Dein Quellcode sieht verdächtig ähnlich wie die sample-partition Funktion, die auf wikipedia das ist nicht stabil, so dass Ihre Funktion ist wahrscheinlich nicht stabil. Zumindest sollten Sie sicherstellen, dass Ihr Drehpunkt r Punkte, um die Letzte position im array von Werten, die gleich Einem[r].
Können Sie machen quicksort stabil (ich bin nicht einverstanden mit Matthew Jones dort), aber nicht in die Standardeinstellung und Schnellste (heh) zu bilden.
Martin (siehe die Kommentare) richtig ist, dass ein quicksort auf eine verknüpfte Liste, wo Sie beginnen mit dem ersten element als pivot und Anhängen Werte am Ende der unteren und der oberen unterlisten, wie Sie gehen durch das array. Allerdings quicksort soll die Arbeit auf ein einfaches array sondern als eine verknüpfte Liste. Einer der Vorteile von quicksort ist es, die geringen Speicherbedarf (weil alles vorhanden). Wenn Sie eine verlinkte Liste sind bereits, dass eine Speicher-overhead für alle Hinweise zu neben-Werte usw, und Sie tauschen diese, anstatt die Werte.
InformationsquelleAutor der Antwort jilles de wit
Wenn Sie brauchen eine stabile O(n*log(n)) zu Sortieren, verwenden Sie mergesort. (Der beste Weg, um quicksort stabil durch die Art und Weise, ist entschieden ein median von Zufallswerten wie der Drehpunkt. Dieses ist nicht stabil für alle Elemente gleichwertig, jedoch.)
InformationsquelleAutor der Antwort JP Alioto
Aus Der Wikipedia:
InformationsquelleAutor der Antwort Matthew Jones
Einen Weg, um dieses problem zu lösen ist, indem nicht mit dem Letzten Element des array als Schlüssel. Quick sort ist in randomisierten Algorithmus.
Seine Leistung hoch, hängt bei der Auswahl ist der Schlüssel. Obwohl-Algorithmus def sagt, wir sollten nehmen Sie die Letzte oder erste element als Schlüssel, in der Realität, können wir wählen ein beliebiges element als Schlüssel.
Also habe ich versucht Median von 3-Ansatz, der sagt, nehmen Sie den ersten ,mittleren und letzten Elements des Arrays. Sortiert Sie, und verwenden Sie dann Mitte position als Key.
So zum Beispiel mein array ist
{9,6,3,10,15}
. So Sortieren ersten, mittleren und letzten Elements wird es{3,6,9,10,15}
. Jetzt mit 9 als Schlüssel. So verschieben Schlüssel zu dem Ende wird es{3,6,15,10,9}
.Alles, was wir brauchen zu kümmern ist, was passiert, wenn 9 kommt mehr als einmal. Entscheidend ist es sich selbst kommt, mehr als einmal.
In solchen Fällen nach der Auswahl-Taste als mittlere index wir brauchen, um zu gehen durch die Elemente zwischen den Schlüssel zum Rechten Ende und wenn kein element gefunden wird, denselben Schlüssel, d.h. wenn 9 ist zwischen einer mittleren position an das Ende machen, 9 als Schlüssel.
Nun in der region von Elementen, die größer als 9 ist, d.h. die Schleife von j, wenn alle 9 gefunden ist, tauschen Sie es mit region-Elemente weniger als das ist region ich. Das array wird stabil sortiert.
InformationsquelleAutor der Antwort Monil
Quick sort ist nicht stabil. Hier ist der Fall, wenn es nicht stabil.
5 5 4 8
unter 1. 5 als pivet, wir haben Sie nach dem 1. Durchlauf-
4 5 5 8
Wie Sie sehen können, um von 5 s wurden verändert. Nun, wenn wir auch weiterhin tun, Sie Sortieren ändert die Reihenfolge von 5 s im sortierten array.
InformationsquelleAutor der Antwort Gajendra Bora