Лисья Нора

Оглавление


§ Вступительный LOGOS

Существует очень большое количество сортировок, по тому количеству, которые существуют, можно написать увесистую книгу размером с кирпич и весом тоже с кирпич, причем одно перечисление всех возможных сортировок только займет страниц пять. Я разберу один из видов сортировки – это сортировка слиянием. Постараюсь разобрать так, чтобы потом самому вспомнить, как он работает.
В чем преимущество такого вида сортировки, так это то, что она в целом то, простая для понимания, а также легко распараллеливается, можно сортировать несколькими потоками, что очень хорошо для например, использования ее на видеокартах, к примеру, бюджетной и недорогой видеокарты NVIDIA RTX 4070 или еще каких-нибудь с маркой PALIT, кто в теме, тот спалит.

§ Примерно как работает

На мгновение представим, что у нас есть неотсортированный массив. Когда представление и визуализация закончена, можно просто написать его для наглядности: 5, 2, 3, 10, 7, 4, 8. Массив содержит в себе 7 элементов и требует хозяйской руки, чтобы его отсортировать. Способов существует тьма-тьмущая, но рассматриваем только сортировку слиянием.
Строго говоря, эта сортировка действует по принципу "дели на две части, пока не поделишь так, что делить будет нечего". Теперь комментируем высказывание, ибо ничего не понятно. Сказано было, что массив надо разделить на две части, причем они могут быть и не равны друг другу по количеству элементов, но все же, надо, чтобы отличались по количеству не более чем на 1 элемент. То есть, если количество элементов, которые мы делим, нечетное, то либо слева будет на один элемент больше, либо справа, это не играет роли.
5, 2, 3, 10, 7, 4, 8
=>
5, 2, 3 | 10, 7, 4, 8
Я разделил надвое массив и получил 3 элемента слева, и 4 элемента справа. В данный момент времени нам это совершенно ничего не дает, потому что деление не завершено до конца. Есть еще что поделить. Теперь делим еще, то есть то что слева получилось сначала делим надвое, и потом то что справа получилось, тоже надвое:
Массив 5 | 2, 3 || 10, 7 | 4, 8
Слот 1 | 2 | 3 | 4
Вот теперь все поделено нормально. А что значит нормально? Это значит, что дальше мы поделить уже не можем, ибо в слотах остался либо 1 элемент, либо 2. Если так получается, то делить уже далее нельзя. Надо сортировать.

§ Сортировка листьев

Начнем сортировку.
Теперь получим следующий массив:
5 | 2, 3 || 7, 10 | 4, 8
Дело в том, что каждый слот теперь отсортирован верно, но, слоты надо укрупнить теперь. И как раз вступает в действие принцип MERGE.

§ Слияние отсортированных массивов

Если у нас представлен массив с элементами A1 A2 A3 ... An и массив B1 B2 B3 ... Bn, причем у каждого этого массива все элементы отсортированы по возрастанию (либо по убыванию), то есть алгоритм, который позволяет соединить эти два массива в один отсортированный массив.
Такой метод требует места, потому что слияние массивов невозможно выполнить перестановки хотя бы по той причине, что новый массив должен получится примерно вдвое больше, то есть количество элементов итогового массива будет суммой количества элементов исходных массивов.
Рассмотрим общий алгоритм слияния массива A и массива B.
Лучше всего показать на примере. Возьмем два отсортированных массива и создадим из него новый.
i: 0 1 2 3 4 5 -- номер элемента
A: 1 4 6 10 12 13
B: 3 5 7 8 11
Алгоритм
Итоговый массив будет иметь вид: 1 3 4 6 7 8 10 11 12 13, то есть, полностью отсортированный массив.

§ Сортировка слиянием

Итак, разобрались с алгоритмом слияния отсортированных массивов и как это применить к сортировке? Очень просто. После того, как были отсортированы слоты из 1 или 2 элементов, эти массивы считаются отсортированными по определению, однако, теперь их надо объединять с помощью алгоритма слияния.
5 | 2, 3 || 7, 10 | 4, 8
Берем группы массивов, которые надо объединить, слева направо. Как видно, слева есть группа из двух массивов 5 и 2,3. С помощью слияния, объединяется в другой массив 2,3,5. Вторая группа справа, это массивы 7,10 и массив 4,8. С помощью алгоритма слияния, получается массив 4,7,8,10. Теперь подставим результаты:
5 | 2,3 || 7,10 | 4,8
=>
2,3,5 || 4,7,8,10
Как видим, теперь же получились 2 группы отсортированных по возрастанию массивов. Они не могут быть не отсортированными, потому что слияние двух отсортированных всегда дает другой отсортированный массив.
Применяем опять то же самое слияние для левого и правого массива, получая итоговый массив:
2,3,5 || 4,7,8,10
=>
2,3,4,5,7,8,10
Тем самым получается полностью отсортированный по возрастанию массив методом слияния.