C randomisierte pivot-quicksort (Verbesserung der Funktion partition)
Ich bin ein informatik-student (gerade begonnen) war ich auf das schreiben von pseudocode eine pivot-randomisierte version von Quicksort. Habe ich schon geschrieben und getestet und es funktioniert alles perfekt aber...
Die partition Teil sieht ein bisschen zu kompliziert, wie es sich anfühlt, habe ich etwas verpasst oder overthought. Ich kann nicht verstehen, wenn es ok ist, oder wenn ich machte einige vermeidbare Fehler.
Also lange Rede, kurzer Sinn: es funktioniert, aber wie man es besser machen?
Vielen Dank im Voraus für alle die helfen
void partition(int a[],int start,int end)
{
srand (time(NULL));
int pivotpos = 3; //start + rand() % (end-start);
int i = start; //index 1
int j = end; //index 2
int flag = 1;
int pivot = a[pivotpos]; //sets the pivot's value
while(i<j && flag) //main loop
{
flag = 0;
while (a[i]<pivot)
{
i++;
}
while (a[j]>pivot)
{
j--;
}
if(a[i]>a[j]) //swap && sets new pivot, and restores the flag
{
swap(&a[i],&a[j]);
if(pivotpos == i)
pivotpos = j;
else if(pivotpos == j)
pivotpos = i;
flag++;
}
else if(a[i] == a[j]) //avoids getting suck on a mirror of values (fx pivot on pos 3 of : 1-0-0-1-1)
{
if(pivotpos == i)
j--;
else if(pivotpos == j)
i++;
else
{
i++;
j--;
}
flag++;
}
}
}
Wo ist der code, der für die verwürfelung der pivot?
Siehe p2p.wrox.com/visual-c/66347-quick-sort-c-code.html
Warum dieser und nicht mit dem median einer Stichprobe, wie median-von-drei (ersten, mittleren, letzten; Sie zu Sortieren, wählen Sie neue Mitte als pivot. Hat den Vorteil, dass die natürlichen Wächter für die Partitionierung.) Check-out Bentely und McIllroy "Engineering eine Art Funktion" Software: - Praxis und Erfahrung 23:11 (Nov 1993), S. 1249-1265.
int pivotpos = 3;
(gewählt fairen Würfel)Siehe p2p.wrox.com/visual-c/66347-quick-sort-c-code.html
Warum dieser und nicht mit dem median einer Stichprobe, wie median-von-drei (ersten, mittleren, letzten; Sie zu Sortieren, wählen Sie neue Mitte als pivot. Hat den Vorteil, dass die natürlichen Wächter für die Partitionierung.) Check-out Bentely und McIllroy "Engineering eine Art Funktion" Software: - Praxis und Erfahrung 23:11 (Nov 1993), S. 1249-1265.
InformationsquelleAutor user3236524 | 2014-01-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist der pseudo-code des
partition()
aus Einführung in Algorithmen , die aufgerufen wird, Lomuto - Partitioning-Algorithmus, und es gibt eine gute Erklärung unten in dem Buch.Implementieren Sie eine randomisierte partition Umsetzung leicht auf der Grundlage der pseudo-code oben. Wie der Kommentar wies darauf hin, bewegen Sie den
srand()
aus derpartition
.Ist und die andere partition-Methode erwähnt in dem Buch, die sogenannte Hoare - Partitionierung-Algorithmus, der pseudo-code ist wie folgt:
Nachdem Sie die partition, die jedes element in A[p...j] ≤ jedes element in A[j+1...r]. Also den quicksort wäre:
srand()
nicht gehören, in der die Partitionsfunktion verwendet einen quicksort-Algorithmus.Hoare - partition ist effizienter (weniger Daten bewegen).
Was ist der Unterschied in deinem ersten Programm mit regelmäßigen quicksort? Berechnen Sie die random-index, aber dann weisen Sie es
end
sowie die swap-Wert mitarr[end]
so ist es wie es nie passiert. Bin ich etwas fehlt?Ich weisen
end
zupivot_index
nach dieswap
, so, jetzta[pivot_index]
ist zufällig.InformationsquelleAutor jfly
Gibt es mehrere Möglichkeiten, um die partition für quicksort, das folgende wird wahrscheinlich die einfachste, die ich aufbringen kann. In der Regel zwei Schulen der Partitionierung verwendet werden:
Bevorzuge ich den Sweep-Algorithmus für die Leute lernen quicksort und partitionieren nur weil es ist tot-einfach zu implementieren ist. Beide können umgesetzt werden, führen in-place-Partitionierung, wie es der Fall bei der Umsetzung unten. Zu keinem Zeitpunkt, außer in
swap()
werden Sie sehen, einen Wert, gespeichert in temp-Lagerung.Anhand einer zufälligen pivot-Auswahl ist nur ein kleiner Teil davon. Der folgende Code zeigt, wie Sie initialisiert den Zufallszahlen-generator, und zeigt wahrscheinlich die einfachste partition quicksort-Algorithmus und die Verwendung der darin wirst du finden.
Es demonstriert unter anderem, dass in C/C++, brauchen Sie nicht beide enden einer partition, da einfache Zeiger-Arithmetik verwendet werden kann zum einstellen der "oberen" Hälfte der Scheidewand. Finden Sie die
quicksort()
Funktion, wie dies geschehen ist.Ausgabe (variiert natürlich),
Hinweis: dies gilt NICHT für modulo-bias für die Verwendung
rand() % len
, und ehrlich gesagt, es wäre übertrieben, dies zu tun für dieses Beispiel. Wenn es kritisch ist, würde ich einen anderen generator vollständig. Ein herausragende der Diskussion Methoden der Wahl zufälliger pivot-Standorte für quicksort Partitionierung finden Sie unter diesem Beitrag auf dieser Seite, darunter viele links zu verschiedenen Methoden. Ich schlage vor, die überprüfung es.InformationsquelleAutor WhozCraig