Сортировка слиянием — это эффективный алгоритм сортировки, основанный на операциях слияния. Этот алгоритм является очень типичным примером применения подхода «разделяй и властвуй».
Сначала рассмотрим, как объединить две упорядоченные последовательности. Это очень просто: нужно сравнить первые числа двух последовательностей, сначала взять меньшее и после взятия удалить это число из соответствующей последовательности. Затем сравнить снова; если одна последовательность пуста, просто по одному извлечь данные из другой последовательности.
Видно, что слияние упорядоченных последовательностей довольно эффективно и может достигать O(n).
После решения вышеописанной задачи слияния упорядоченных последовательностей рассмотрим сортировку слиянием. Её основная идея — разделить массив на две группы, A и B. Если данные внутри каждой группы упорядочены, то эти две группы данных можно удобно отсортировать. Как сделать данные внутри этих двух групп упорядоченными?
Вы можете далее разделить группы A и B на две группы каждую. И так далее. Когда разделённая подгруппа содержит только один элемент данных, подгруппу можно считать уже упорядоченной, а затем объединить две соседние подгруппы. Таким образом, сортировка слиянием завершается путём рекурсивного разложения последовательности сначала, а затем слияния последовательностей.
Эффективность сортировки слиянием довольно высока. Пусть длина последовательности равна N. Всего требуется logN шагов, чтобы разделить последовательность на небольшие последовательности. Каждый шаг — это процесс слияния упорядоченных последовательностей, и временную сложность можно записать как O(N), поэтому в сумме получается O(N*logN). Поскольку сортировка слиянием каждый раз работает со смежными данными, среди нескольких методов сортировки со сложностью O(N*logN) (быстрая сортировка, сортировка слиянием, сортировка Шелла, пирамидальная сортировка) сортировка слиянием также является относительно эффективной.
На моем компьютере я сравнил пузырьковую сортировку, сортировку прямым включением, сортировку слиянием и прямое использование системной qsort() (все в Release-версии).Тест с 20,000 случайными элементами данных:

Тест с 50,000 случайными элементами данных:

Затем протестируйте с 200,000 случайными элементами данных:

Примечание: В некоторых книгах в mergearray() выделяется временный массив при слиянии упорядоченных последовательностей, но слишком много операций new отнимает очень много времени. Поэтому было внесено небольшое изменение. Только один временный массив выделяется с помощью new в MergeSort(). Все последующие операции совместно используют этот временный массив.
Автор: MoreWindows
Оригинал: https://blog.csdn.net/morewindows/article/details/6678165