Nickf Algorithmus nicht der beste Weg, dies zu tun. Im schlimmsten Fall vergleicht der nickf-Algorithmus 2 Zahlen pro Zahl, für eine Gesamtzahl von 2n - 2.
Wir können ein bisschen besser machen. Wenn Sie zwei Elemente a und b vergleichen, wissen wir, wenn a> b ist, dass a nicht das Min ist und b nicht das Maximum ist. Auf diese Weise nutzen wir alle verfügbaren Informationen, um so viele Elemente wie möglich zu eliminieren. Nehmen Sie zur Vereinfachung an, dass wir eine gerade Anzahl von Elementen haben.
sie in Paare brechen: (a1, a2), (a3, a4) usw.
vergleichen sie, so dass sie in eine Reihe von Gewinnern und Verlierern zu brechen - das dauert n/2 vergleicht, uns zwei geben Sätze der Größe n/2. Finden Sie nun das Maximum der Gewinner und das Minimum der Verlierer.
Von oben, die Suche nach dem Minimum oder Maximum von n Elementen dauert n-1 Vergleiche. Somit ist die Laufzeit: n/2 (für die ersten Vergleiche) + n/2 - 1 (max der Gewinner) + n/2 - 1 (min der Verlierer) = n/2 + n/2 + n/2 -2 = 3N/2 - 2. Wenn n ungerade ist, haben wir ein weiteres Element in jedem der Sätze, so wird die Laufzeit 3N/2
in der Tat, können wir beweisen, dass dies der schnellste, dass Dieses Problem kann möglicherweise durch irgendeinen Algorithmus gelöst werden.
Ein Beispiel:
Angenommen unsere Array 1, 5, 2, 3, 1, 8, 4 Dividieren in Paare: (1,5), (2,3) (1,8), (4, -). Vergleichen. Die Gewinner sind: (5, 3, 8, 4). Die Verlierer sind (1, 2, 1, 4).
die Gewinner Scannen gibt 8. die Verlierer Scannen gibt 1.
Wenn Sie mit dem ersten Element initialisieren, kümmern Sie sich nicht mehr um die Grenzen Ihres Datentyps. – Mnebuerquo
Initialisieren mit dem ersten Element, Sie nehmen an, dass es eins gibt. (Sequenz könnte leer sein. –
das ist ok. In Javascript, werden Sie niedrig = undefiniert, und hoch = undefiniert. ... macht viel mehr Sinn als negative Unendlichkeit ... – nickf