Злиття сортування - алгоритм сортування, який працює, розділяючи заданий список навпіл, рекурсивно сортуючи обидва менші списки та об'єднуючи їх назад в один відсортований список. Базовий випадок рекурсії надходить до однотонного списку, який не можна розділити далі, але за визначенням вже відсортовано.
Виконання алгоритму у списку [1,7,6,3,3,2,5]
можна візуалізувати таким чином:
[1,7,6,3,3,2,5]
/ \ split
[1,7,6,3] [3,2,5]
/ \ / \ split
[1,7] [6,3] [3,2] [5]
/ \ / \ / \ | split
[1] [7] [6] [3] [3] [2] [5]
\ / \ / \ / | merge
[1,7] [3,6] [2,3] [5]
\ / \ / merge
[1,3,6,7] [2,3,5]
\ / merge
[1,2,3,3,5,6,7]
Завдання
Напишіть програму або функцію, яка приймає список цілих чисел у будь-який розумний спосіб як вхідний і візуалізує різні розділи цього списку, в той час як сортується за алгоритмом сортування злиття. Це означає, що вам не доведеться виводити графік, як вище, але просто списки добре:
[1,7,6,3,3,2,5]
[1,7,6,3][3,2,5]
[1,7][6,3][3,2][5]
[1][7][6][3][3][2][5]
[1,7][3,6][2,3][5]
[1,3,6,7][2,3,5]
[1,2,3,3,5,6,7]
Крім того, будь-яка обґрунтована нотація списку є чудовою, тому наступним також буде дійсним результат
1 7 6 3 3 2 5
1 7 6 3|3 2 5
1 7|6 3|3 2|5
1|7|6|3|3|2|5
1 7|3 6|2 3|5
1 3 6 7|2 3 5
1 2 3 3 5 6 7
Нарешті, спосіб розділити список на два менші списки вирішується лише до тих пір, поки довжина обох результуючих списків відрізняється не більше ніж на один. Це означає, що замість того , щоб розділятись [3,2,4,3,7]
на, [3,2,4]
і [3,7]
ви також можете розділити, взявши елементи з парними та непарними індексами ( [3,4,7]
і[2,3]
) або навіть рандомізувати поділ кожного разу.
Це код-гольф , тому виграє найкоротший код будь-якою мовою, виміряний в байтах.
Тестові справи
Як зазначалося вище, вам залежить власне формат та спосіб розділити списки навпіл.
[10,2]
[10][2]
[2,10]
[4,17,1,32]
[4,17][1,32]
[4][17][1][32]
[4,17][1,32]
[1,4,17,32]
[6,5,4,3,2,1]
[6,5,4][3,2,1]
[6,5][4][3,2][1]
[6][5][4][3][2][1]
[5,6][4][2,3][1] <- Important: This step cannot be [5,6][3,4][1,2], because 3 and 4 are on different branches in the the tree
[4,5,6][1,2,3]
[1,2,3,4,5,6]
[[1,2],[3],[4,5],[6]]
Етап насправді є правильним рішенням, оскільки сортування злиття працює рекурсивно. Тобто, якщо ми почнемо з [1,2,3,4,5,6]
і розділимо їх на, [1,2,3]
і [4,5,6]
тоді ці списки обробляються незалежно, поки вони не будуть об'єднані на останньому кроці.
[3]
і [2,1]
, то вони знаходяться на різних гілках, тому ми не можемо злитися, [3]
а [2]
після [2,1]
розщеплені на [2]
і [1]
.