Я должен отсортировать список номеров, но я супер ленивый. Очень сложно понять, как поменять местами все числа, пока они не будут в порядке возрастания, поэтому я разработал собственный алгоритм, который будет гарантировать сортировку нового списка ». Вот как это работает:
Для списка размера N нам понадобится N-1 итераций. На каждой итерации
Проверьте, меньше ли N-й номер, чем N + 1-й номер. Если это так, то эти два числа уже отсортированы, и мы можем пропустить эту итерацию.
Если это не так, то вам нужно постоянно уменьшать первые N чисел, пока эти два числа не будут в порядке.
Давайте возьмем конкретный пример. Допустим, вход был
10 5 7 6 1
На первой итерации мы сравним 10 и 5. 10 больше 5, поэтому мы уменьшаем его до тех пор, пока оно не станет меньше:
4 5 7 6 1
Теперь мы сравним 5 и 7. 5 меньше, чем 7, поэтому нам не нужно ничего делать на этой итерации. Итак, мы переходим к следующему и сравниваем 7 и 6. 7 больше 6, поэтому мы уменьшаем первые три числа до 6, и получаем:
2 3 5 6 1
Теперь мы сравниваем 6 и 1. Опять же, 6 больше 1, поэтому мы уменьшаем первые четыре числа до тех пор, пока оно не станет меньше 1, и мы получим это:
-4 -3 -1 0 1
И мы сделали! Теперь наш список в идеальном порядке. И, чтобы сделать вещи еще лучше, нам нужно было только перебирать список N-1 раз, так что этот алгоритм сортирует списки за O (N-1) время, которое, я уверен, является самым быстрым алгоритмом.
Ваша задача на сегодня - реализовать эту Ленивую Сорт. Ваша программа или функция получит массив целых чисел в любом стандартном формате, который вам нравится, и вы должны выполнить эту отложенную сортировку и вернуть новый «отсортированный» список. Массив никогда не будет пустым или содержит нецелые числа.
Вот некоторые примеры:
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
Как всегда, это код-гольф , поэтому напишите самую короткую программу, какую только сможете!
¹ Это не означает, что это звучит, как это означает, но это технически верно
² Я шучу, пожалуйста, не ненавидь меня
<sarcasm>
Этот алгоритм сортировки на самом деле все еще имеет O(N^2)
временную сложность, потому что вы должны пройти через все ранее доступные элементы в списке, чтобы уменьшить их. Вместо этого я рекомендую просмотреть список в обратном порядке и при необходимости уменьшать только одно число на шаг. Это даст вам истинную O(N)
сложность! </sarcasm>
O(n^2)
с точки зрения доступа к памяти, но не O(n)
для сравнения?
O(N^2)
.