Сортировка вставками с бинарным поиском
при реализации сортировки вставки двоичный поиск может использоваться для поиска позиции в первых i - 1 элементах массива, в который должен быть вставлен элемент i.
Как это повлияет на количество необходимых сравнений? Как использование такого двоичного поиска повлияет на асимптотическое время выполнения сортировки вставки?
Я уверен, что это уменьшит количество сравнений, но я не совсем уверен, почему.
3 ответов
прямиком из Википедии:
Если стоимость сравнения превышает стоимость свопов, как это имеет место например, со строковыми ключами, хранящимися по ссылке или с человеком взаимодействие (например, выбор одной из пар, отображаемых бок о бок), тогда использование сортировки двоичной вставки может дать лучшую производительность. Бинарные вставка сортировка использует двоичный поиск для определения правильного расположение для вставки новых элементов, и поэтому выполняет ⌈log2 (n)⌉ сравнения в худший случай, который O (N log n). Алгоритм как все еще имеет время выполнения O (n2) в среднем из-за серия свопов, необходимых для каждой вставки.
источник:
http://en.wikipedia.org/wiki/Insertion_sort#Variants
вот пример:
http://jeffreystedfast.blogspot.com/2007/02/binary-insertion-sort.html
Я довольно уверен, что это уменьшит количество сравнений,но я не совсем понимаю почему.
Ну, если вы уже знаете сортировку вставки и двоичный поиск, то его довольно прямо вперед. При вставке фрагмента в сортировку вставки необходимо сравнить его со всеми предыдущими фрагментами. Скажем, вы хотите переместить это [2] в правильное место, вам нужно будет сравнить с 7 частями, прежде чем вы найдете правильное место.
[1][3][3][3][4][4][5] ->[2]
однако, если вы начнете сравнение на полпути (например, двоичный поиск), то вы будете сравнивать только до 4 штук! Вы можете сделать это, потому что вы знаете, что левые части уже в порядке (вы можете делать только двоичный поиск, Если части в порядке!).
теперь представьте, если бы у вас были тысячи штук (или даже миллионы), это сэкономило бы вам много времени. Надеюсь, это поможет. |=^)
Если у вас есть хорошая структура данных для эффективного двоичного поиска, вряд ли будет время вставки O(log n). И наоборот, хорошая структура данных для быстрой вставки в произвольной позиции вряд ли будет поддерживать двоичный поиск.
для достижения производительности O(N log n) лучших поисков сравнения с сортировкой вставки потребуется как o(log n) двоичный поиск, так и o(log n) произвольная вставка.
предполагая, что массив отсортирован (для выполнения двоичного поиска), он не уменьшит никаких сравнений, поскольку внутренний цикл заканчивается сразу после 1 сравнения (поскольку предыдущий элемент меньше). В общем случае количество сравнений в сортировке вставки равно максимальному количеству инверсий плюс размер массива-1.
поскольку число инверсий в отсортированном массиве равно 0, максимальное число сравнений в уже отсортированном массиве равно N-1.