Ich soll eine Liste von Zahlen sortieren, aber ich bin super faul. Es ist wirklich schwer herauszufinden, wie man alle Zahlen vertauscht, bis sie alle in aufsteigender Reihenfolge vorliegen. Deshalb habe ich einen eigenen Algorithmus entwickelt, der sicherstellt, dass die neue Liste sortiert ist¹. So funktioniert das:
Für eine Liste der Größe N benötigen wir N-1 Iterationen. Bei jeder Iteration
Überprüfen Sie, ob die N-te Zahl kleiner als die N + 1-te Zahl ist. Wenn dies der Fall ist, sind diese beiden Zahlen bereits sortiert, und wir können diese Iteration überspringen.
Wenn dies nicht der Fall ist, müssen Sie die ersten N Zahlen kontinuierlich dekrementieren, bis diese beiden Zahlen in Ordnung sind.
Nehmen wir ein konkretes Beispiel. Angenommen, die Eingabe war
10 5 7 6 1
Bei der ersten Iteration vergleichen wir 10 und 5. 10 ist größer als 5, also dekrementieren wir es, bis es kleiner ist:
4 5 7 6 1
Jetzt vergleichen wir 5 und 7. 5 ist kleiner als 7, sodass wir bei dieser Iteration nichts tun müssen. Also gehen wir zum nächsten und vergleichen 7 und 6. 7 ist größer als 6, also dekrementieren wir die ersten drei Zahlen, bis sie kleiner als 6 sind, und wir erhalten Folgendes:
2 3 5 6 1
Jetzt vergleichen wir 6 und 1. Auch hier ist 6 größer als 1, also dekrementieren wir die ersten vier Zahlen, bis sie kleiner als 1 sind, und wir erhalten Folgendes:
-4 -3 -1 0 1
Und wir sind fertig! Jetzt ist unsere Liste perfekt sortiert. Und um die Sache noch besser zu machen, mussten wir die Liste nur N-1- mal durchlaufen , sodass dieser Algorithmus Listen in O (N-1) -Zeit sortiert. Ich bin mir ziemlich sicher, dass dies der schnellste Algorithmus ist, den es gibt.²
Ihre Herausforderung für heute ist es, diese Lazy Sort zu implementieren. Ihr Programm oder Ihre Funktion erhält ein Array von Ganzzahlen in einem beliebigen Standardformat, und Sie müssen diese verzögerte Sortierung durchführen und die neue "sortierte" Liste zurückgeben. Das Array wird niemals leer sein oder Nicht-Ganzzahlen enthalten.
Hier sind einige Beispiele:
Input: 10 5 7 6 1
Output: -4 -3 -1 0 1
Input: 3 2 1
Output: -1 0 1
Input: 1 2 3
Output: 1 2 3
Input: 19
Output: 19
Input: 1 1 1 1 1 1 1 1 1
Output: -7 -6 -5 -4 -3 -2 -1 0 1
Input: 5 7 11 6 16 2 9 16 6 16
Output: -27 -25 -21 -20 -10 -9 -2 5 6 16
Input: -8 17 9 7
Output: -20 5 6 7
Wie immer ist dies Code-Golf , schreiben Sie also das kürzeste Programm, das Sie können!
¹ Dies bedeutet nicht, wie es sich anhört, aber es ist technisch wahr
² Ich mache nur Spaß, bitte hasse mich nicht
<sarcasm>
Dieser Sortieralgorithmus wird immer noch zeitaufwändig, O(N^2)
da Sie alle zuvor aufgerufenen Elemente in der Liste durchgehen müssen, um sie zu dekrementieren. Ich empfehle stattdessen, die Liste rückwärts durchzugehen und bei Bedarf nur eine Zahl pro Schritt zu verringern. Dies wird Ihnen wahre O(N)
Komplexität geben! </sarcasm>
O(n^2)
in Bezug auf Speicherzugriffe, aber ist es nicht O(n)
für Vergleiche?
O(N^2)
.