Я повинен сортувати список номерів, але я дуже ледачий. Дійсно важко зрозуміти, як поміняти всі числа навколо, поки всі вони не будуть у порядку зростання, тому я придумав власний алгоритм, який гарантуватиме, що новий список буде відсортований¹. Ось як це працює:
Для списку розміру 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)
.