Педагогическое измерение
Из-за своей простоты метод разбиения Lomuto может быть проще в реализации. В « Жемчужине программирования» Джона Бентли о сортировке есть хороший анекдот :
«В большинстве обсуждений быстрой сортировки используется схема разбиения, основанная на двух приближающихся индексах [...] [то есть Хоаре]. Хотя основная идея этой схемы проста, я всегда находил детали хитрыми - однажды я провел большую часть двух дней, отыскивая ошибку, скрывающуюся в коротком цикле разбиения. Читатель предварительного проекта пожаловался, что стандартный двухиндексный метод на самом деле проще, чем метод Ломуто, и набросал некоторый код, чтобы подчеркнуть его; Я перестал смотреть после того, как нашел две ошибки.
Измерение производительности
Для практического использования простота реализации может быть принесена в жертву ради эффективности. Теоретически, мы можем определить количество сравнений элементов и обменов для сравнения производительности. Кроме того, на фактическое время работы будут влиять другие факторы, такие как производительность кэширования и неправильные прогнозы ветвлений.
Как показано ниже, алгоритмы ведут себя очень похоже на случайные перестановки, за исключением количества перестановок . Там Ломуто нужно в три раза больше, чем Хоаре!
Количество сравнений
n−1n
Количество свопов
Количество перестановок является случайным для обоих алгоритмов, в зависимости от элементов в массиве. Если мы предполагаем случайные перестановки , то есть все элементы различны, и каждая перестановка элементов одинаково вероятна, мы можем проанализировать ожидаемое количество перестановок .
1,…,n
Метод Ломуто
jA[j]x1,…,nx−1xx−1x
{1,…,n}1n
1n∑x=1n(x−1)=n2−12.
n
Метод Хоара
x
ijxij
x
Hyp(n−1,n−x,x−1)n−xx−1(n−x)(x−1)/(n−1)x
Наконец, мы снова усредняем значения по всем опорным точкам, чтобы получить общее ожидаемое количество перестановок для разбиения Хоара:
1n∑x=1n(n−x)(x−1)n−1=n6−13.
(Более подробное описание можно найти в моей магистерской диссертации , стр. 29.)
Шаблон доступа к памяти
Оба алгоритма используют два указателя в массиве, которые сканируют его последовательно . Поэтому оба ведут себя почти оптимально по отношению к кешированию.
Равные элементы и уже отсортированные списки
Как уже упоминалось в Wandering Logic, производительность алгоритмов отличается более резко для списков, которые не являются случайными перестановками.
n/2
0ijO(nlogn)
0A[j] <= x
i=nΘ(n2)
Заключение
Метод Ломуто прост и проще в реализации, но его не следует использовать для реализации метода сортировки библиотеки.
A[i+1] <= x
. В отсортированном массиве (и с учетом разумно выбранных опорных точек) Хоар почти не меняет местами, а Ломуто делает тонну (как только j становится достаточно маленьким, тогда всеA[j] <= x
.) Чего мне не хватает?