Как мы можем выполнить слияние 8 элементов только с 16 сравнениями?

Ну, я задал вопрос о сортировке несколько дней назад. Я узнал, как доказать, что наименьшее количество сравнений путем сортировки 8 элементов равно 16, и я понял, почему. Но мой алгоритм сортировки слиянием насчитывает 17 сравнений, и в моем случае это правильно. Чтобы объединить два отсортированных массива длиной x и y каждый, нам нужно (x+y)-1 сравнение, поэтому в merge sort мы получаем 17 сравнений. Но это должно быть возможно с 16 сравнениями, так.. как? где я могу сохранить это сравнение 1).

здесь изображение:

enter image description here

http://oeis.org/A001768

спасибо!

3 ответов


OP содержит четкое доказательство того, что сортировка слиянием из 8 элементов невозможно с менее чем 17 сравнениями. Тем не менее, можно отсортировать 8 элементов в 16 сравнениях с другим алгоритмом. Алгоритм описан в книге Д. кнута "искусство компьютерного программирования", Том 3, Глава 5.3.1. Он называется слияние вставки.

наименьшее количество сравнений не делает этот алгоритм самым быстрым. Например, дозатор чет–нечет сортировка слиянием С 19 сравнениями легко превосходит слияние вставки потому что он выполняет большинство сравнений параллельно.


вы можете получить наименьшее решение только тогда, когда у вас есть нечетное количество чисел для сортировки.


вы можете доказать, что 16 сравнений недостаточно, попробовав все возможные алгоритмы. Для этого вам понадобится и "алгоритм генерации алгоритма".