Оптимизация сортировки слиянием

Сортировка слиянием — довольно распространенный алгоритм сортировки, и я написал работающий алгоритм сортировки слиянием. Потом хочу оптимизировать. Первым шагом было преобразовать его из рекурсивного в итеративный, что я и сделал. Тогда я не мог понять, что еще можно оптимизировать. Изучив множество статей в Интернете, я нашел два механизма: использование множественной сортировки слиянием и плиточной сортировки слиянием. Однако ни один из документов не содержал никакого псевдокода и даже не объяснял, как это сделать, и как он предлагает преимущества, о которых говорит его автор, такие как удобство кеша и улучшенная локация.

Может ли кто-нибудь уточнить этот вопрос и, если возможно, предоставить какой-нибудь псевдокод? В частности, я хочу знать, как сделать его удобным для кеша. Я вообще понятия не имею, что это за штуки, а то сам бы попробовал.


person SexyBeast    schedule 25.09.2012    source источник
comment
Если вы хотите быть униженным, взгляните на Timsort. Это сортировка слиянием, но она битком набита безумно умными оптимизациями.   -  person    schedule 26.09.2012
comment
Да, я посмотрю на это. Но статья в Вики говорит, что это само по себе может быть довольно сложным, так что тут тоже не очень повезло. Я хочу знать, как можно сделать алгоритм сортировки удобным для кеша...   -  person SexyBeast    schedule 26.09.2012
comment
Это сложно, но, по крайней мере, хорошо задокументировано. Что касается удобства кеша, если это ваш вопрос, пожалуйста, уточните это. В основном это сводится к тому, чтобы код обращался к памяти в том порядке, в котором кеши ЦП хорошо оптимизируют.   -  person    schedule 26.09.2012


Ответы (1)


Одна распространенная и относительно простая оптимизация, которую вы можете сделать, — это переключиться с сортировки слиянием на другой алгоритм, такой как сортировка вставками, когда размеры подмассива становятся ниже определенного порога. Хотя сортировка слиянием выполняется за время O(n log n), это говорит о ее долгосрочной скорости роста и ничего не говорит о том, насколько хорошо алгоритм будет работать на небольших входных данных. Сортировка вставками, например, работает довольно быстро при небольших размерах входных данных, хотя в долгосрочной перспективе она хуже. Следовательно, рассмотрите возможность изменения базового случая вашей сортировки слиянием, чтобы, если массив для сортировки был ниже определенного порога размера (скажем, 50-100), вы использовали сортировку вставками, а не продолжали рекурсию. По опыту, это может заметно улучшить производительность алгоритма.

person templatetypedef    schedule 26.08.2015