Я думаю, что до тех пор, пока данные помещаются в память, хорошая реализация сортировки слиянием работает лучше, чем хорошая реализация быстрой сортировки.
Одна из наиболее широко используемых реализаций qsort (), glibc qsort (), внутренне использует сортировку слиянием для большинства случаев, когда данные помещаются в память. Эта сортировка слиянием выделяет временное пространство памяти, используемое для слияния, что добавляет некоторую нагрузку на память, но в большинстве случаев она превосходит собственную реализацию внутренней быстрой сортировки с хорошим выбором и оптимизацией сводных данных. glibc использует быструю сортировку только тогда, когда данные и временная память для сортировки слиянием не могут поместиться в памяти.
Я измерил производительность этих двух реализаций на моей машине с 2,1 ГГц процессором и несколькими ГБ оперативной памяти. Входные данные генерируются с помощью псевдослучайного генератора, и каждый ключ представляет собой 32-разрядное целое число без знака, что означает немного больше циклов сравнения, чем целочисленное сравнение, благодаря интерфейсу функции сравнения.
Для сортировки слиянием:
2 MB, time_diff 165.156000 ms, 78.752518 ns per byte
4 MB, time_diff 344.298000 ms, 82.087040 ns per byte
8 MB, time_diff 730.926000 ms, 87.133169 ns per byte
16 MB, time_diff 1541.215000 ms, 91.863573 ns per byte
32 MB, time_diff 3088.924000 ms, 92.057109 ns per byte
64 MB, time_diff 6262.868000 ms, 93.324006 ns per byte
128 MB, time_diff 12887.018000 ms, 96.015766 ns per byte
256 MB, time_diff 26731.597000 ms, 99.582959 ns per byte
Для быстрой сортировки:
2 MB, time_diff 243.519000 ms, 116.118908 ns per byte
4 MB, time_diff 504.975000 ms, 120.395422 ns per byte
8 MB, time_diff 1075.276000 ms, 128.182888 ns per byte
16 MB, time_diff 2183.865000 ms, 130.168498 ns per byte
32 MB, time_diff 4343.993000 ms, 129.461080 ns per byte
64 MB, time_diff 8714.166000 ms, 129.851192 ns per byte
128 MB, time_diff 17881.344000 ms, 133.226395 ns per byte
256 MB, time_diff 36751.029000 ms, 136.908252 ns per byte
Вы можете видеть, что между этими двумя реализациями существуют четкие различия в производительности и почему в такой широко используемой реализации qsort сортировка слиянием предпочтительнее, чем быстрой сортировкой. Основная причина этого различия заключается в том, что быстрая сортировка имеет на 10-20% больше сравнений, чем сортировка слиянием, из-за неравномерного разделения на каждом шаге.