Wie kann ich eine Liste mit 5 ganzen Zahlen sortieren, sodass im schlimmsten Fall 7 Vergleiche erforderlich sind? Es ist mir egal, wie viele andere Operationen durchgeführt werden. Ich weiß nichts Besonderes über die ganzen Zahlen.
Ich habe ein paar verschiedene Divide-and-Conquer-Ansätze ausprobiert, mit denen ich auf 8 Vergleiche zurückgreifen kann, z. B. einen Mergesort-Ansatz verfolgen oder Mergesort mit der binären Suche kombinieren, um die Einfügeposition zu finden, aber jedes Mal, wenn ich 8 erhalte, wird der schlechteste Fall verglichen .
Im Moment suche ich nur einen Hinweis, keine Lösung.
algorithms
sorting
Robert S. Barnes
quelle
quelle
if(x > y)
ist das das gleiche,if((x - y) & 0x80)
was kaum zu vergleichen ist. Ich denke, wir sollten vergessen, dass die Objekte ganze Zahlen sind und davon ausgehen, dass wir eine magischecompare(x, y)
Funktion verwenden müssen, um diese Objekte zu vergleichen ...Antworten:
Es gibt nur einen Weg, um diesen Prozess zu starten (und für fast alle Ihre Entscheidungen, was in späteren Schritten verglichen werden soll, gibt es nur einen richtigen). Hier erfahren Sie, wie Sie es herausfinden. Beachten Sie zunächst, dass es mögliche Antworten für Ihre Vergleiche gibt, und 5 ! = 120 verschiedene Permutationen, zwischen denen Sie unterscheiden müssen.27= 128 5 ! = 120
Der erste Vergleich ist einfach: Sie müssen zwei Schlüssel vergleichen, und da Sie nichts über sie wissen, sind alle Auswahlmöglichkeiten gleich gut. Nehmen wir also an, Sie vergleichen und b und stellen fest, dass a ≤ b ist . Sie haben jetzt noch 2 6 = 64 mögliche Antworten und 60 mögliche Permutationen (da wir die Hälfte davon eliminiert haben).ein b a ≤ b 26= 64 60
Als nächstes können wir entweder und d vergleichen , oder wir können c mit einem der Schlüssel vergleichen , die wir im ersten Vergleich verwendet haben. Wenn wir c und d vergleichen und feststellen , dass c ≤ d ist , haben wir 32 verbleibende Antworten und 30 mögliche Permutationen. Auf der anderen Seite, wenn wir vergleichen c mit ein , und wir entdecken , dass ein ≤ c , wir haben 40 mögliche Permutationen bleiben, weil wir beseitigt haben 1 / 3 der möglichen Permutationen (die mit c ≤c d c c d c ≤ d 32 30 c ein a≤c 40 1/3 ). Wir haben nur noch 32 mögliche Antworten, also haben wir Pech.c≤a≤b 32
Jetzt wissen wir also, dass wir den ersten und den zweiten Schlüssel sowie den dritten und den vierten Schlüssel vergleichen müssen. Wir können annehmen, dass wir und c ≤ d haben . Wenn wir vergleichen e auf eine dieser vier Tasten, durch das gleiche Argument , das wir im vorherigen Schritt verwendet wird , könnten wir nur beseitigen 1 / 3 der Permutationen bleiben, und wir sind kein Glück. Also müssen wir zwei der Schlüssel a , b , c , d vergleichen . Unter Berücksichtigung der Symmetrie haben wir zwei Möglichkeiten: Vergleichen Sie a und c oder Vergleichen Sie a und da≤b c≤d e 1/3 a,b,c,d a c a d . Ein ähnliches Zählargument zeigt, dass wir und c vergleichen müssen . Wir können ohne Einschränkung der Allgemeinheit annehmen, dass a ≤ c , und jetzt haben wir a ≤ b und a ≤ c ≤ d .ein c a ≤ c a ≤ b a ≤ c ≤ d
Da Sie um einen Hinweis gebeten haben, werde ich den Rest des Arguments nicht durchgehen. Sie haben noch vier Vergleiche. Setze sie mit Bedacht ein.
quelle
Sie finden dies in The Art of Computer Programming, Band III, von D. Knuth, aber die Strategie ist wie folgt (ich nehme an, Sie haben das Array ): Wenn Sie einen Hinweis lesen möchten Nur die ersten beiden Zeilen meiner Antwort{ a , b , c , d, e }
Alle oben genannten Wege führen zu höchstens drei Vergleichen nach erstem Vergleich von mit c . (bedeutet höchstens 7).e c
quelle