Powinienem posortować listę liczb, ale jestem bardzo leniwy. Naprawdę trudno jest wymyślić, jak zamieniać wszystkie liczby, dopóki wszystkie nie będą rosły w porządku, więc wymyśliłem własny algorytm, który zagwarantuje, że nowa lista zostanie posortowana¹. Oto jak to działa:
Aby uzyskać listę rozmiarów N , potrzebujemy iteracji N-1 . Przy każdej iteracji
Sprawdź, czy N-ty numer jest mniejszy niż N + 1-ty numer. Jeśli tak, to te dwie liczby są już posortowane i możemy pominąć tę iterację.
Jeśli nie są, musisz ciągle zmniejszać pierwsze N liczb, aż te dwie liczby będą w porządku.
Weźmy konkretny przykład. Powiedzmy, że dane wejściowe były
10 5 7 6 1
Przy pierwszej iteracji porównamy 10 i 5. 10 jest większe niż 5, więc zmniejszamy go, aż będzie mniejszy:
4 5 7 6 1
Teraz porównujemy 5 i 7. 5 jest mniejsze niż 7, więc nie musimy nic robić w tej iteracji. Przechodzimy więc do następnego i porównujemy 7 i 6. 7 jest większe niż 6, więc zmniejszamy pierwsze trzy liczby, aż będą mniejsze niż 6, i otrzymujemy:
2 3 5 6 1
Teraz porównujemy 6 i 1. Ponownie, 6 jest większe niż 1, więc zmniejszamy pierwsze cztery liczby, aż będą mniejsze niż 1, i otrzymujemy:
-4 -3 -1 0 1
I skończone! Teraz nasza lista jest w idealnym porządku posortowanym. A żeby było jeszcze lepiej, musieliśmy tylko iterować listę N-1 razy, więc ten algorytm sortuje listy w czasie O (N-1) , co, jestem pewien, jest najszybszym dostępnym algorytmem.
Twoim dzisiejszym wyzwaniem jest wdrożenie tego Lazy Sort. Twój program lub funkcja otrzyma tablicę liczb całkowitych w dowolnym standardowym formacie, który ci się podoba, i musisz wykonać to leniwe sortowanie i zwrócić nową listę „posortowaną” . Tablica nigdy nie będzie pusta ani nie będzie zawierać liczb całkowitych.
Oto kilka przykładów:
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
Jak zawsze jest to golf kodowy , więc napisz najkrótszy program, jaki możesz!
¹ To nie znaczy, jak to brzmi, ale jest technicznie prawdą
² Żartuję całkowicie, proszę, nie nienawidź mnie
<sarcasm>
Ten algorytm sortowania w rzeczywistości wciąż mierzy O(N^2)
złożoność czasową, ponieważ musisz przejrzeć wszystkie wcześniej dostępne elementy na liście, aby je zmniejszyć. Zamiast tego polecam przewinięcie listy do tyłu i, w razie potrzeby, zmniejszanie tylko jednej liczby na krok. To zapewni Ci prawdziwą O(N)
złożoność! </sarcasm>
O(n^2)
pod względem dostępu do pamięci, ale czy nie jest to O(n)
dla porównań?
O(N^2)
.