Я'пытаюсь понять несколько алгоритмов сортировки, но мне'трудно увидеть разницу в алгоритме пузырьковой сортировки и сортировки вставкой.
Я знаю, что оба они O(n2), но мне кажется, что пузырьковая сортировка просто поднимает максимальное значение массива к вершине за каждый проход, в то время как сортировка вставкой просто опускает наименьшее значение к низу за каждый проход. Разве они не делают одно и то же, но в разных направлениях?
Для сортировки вставкой количество сравнений/потенциальных обменов начинается с нуля и увеличивается каждый раз (т.е. 0, 1, 2, 3, 4, ..., n), а для сортировки пузырьком происходит то же самое, но в конце сортировки (т.е. n, n-1, n-2, ... 0), потому что сортировке пузырьком больше не нужно сравнивать с последними элементами по мере их сортировки.
При всем при этом, похоже, все согласны с тем, что сортировка вставками в целом лучше. Может ли кто-нибудь сказать мне, почему?
Edit: В первую очередь меня интересуют различия в работе алгоритмов, а не их эффективность или асимптотическая сложность.
После я итераций первая я элементы упорядочены.
В каждой итерации следующий элемент прогоняется через сортировка раздел, пока не достигнет нужном месте:
sorted | unsorted
1 3 5 8 | 4 6 7 9 2
1 3 4 5 8 | 6 7 9 2
В 4 барботирует в отсортированный раздел
Псевдокод:
for i in 1 to n
for j in i downto 2
if array[j - 1] > array[j]
swap(array[j - 1], array[j])
else
break
После того, как я итераций последние я элементы являются крупнейшими, и приказал.
В каждой итерации, просеять через неразобранные раздел чтобы найти максимум.
unsorted | biggest
3 1 5 4 2 | 6 7 8 9
1 3 4 2 | 5 6 7 8 9
В 5-это выбивает из несортированного раздел
Псевдокод:
for i in 1 to n
for j in 1 to n - i
if array[j] > array[j + 1]
swap(array[j], array[j + 1])
Обратите внимание, что типичная реализация досрочного прекращения, если нет свопы совершаются в ходе одной итерации внешнего цикла (так как это означает, что массив отсортирован).
В вставки элементов сортировки клокотала в отсортированный раздел, в то время как в пузырьковой сортировки максимумов выбивает из несортированного разделе.
В пузырьковой сортировке на первой итерации у вас n-i-1 внутренних итераций (n^2)/2 всего, а во вставной сортировке у вас максимум i итераций на i'ом шаге, но i/2 в среднем, так как вы можете остановить внутренний цикл раньше, после того как нашли правильную позицию для текущего элемента. Таким образом, у вас есть (сумма от 0 до n) / 2, что составляет (n^2) / 4 всего;
Вот почему сортировка вставками быстрее, чем сортировка пузырьками.
Еще одно отличие, я не'т см. здесь:
Сортировка пузырьком и 3 задания стоимость свопа: вам предстоит построить первый временную переменную, чтобы сохранить значение, которое вы хотите продвигать(нет.1), чем вы должны писать другие замены переменной в месте вы просто спасли ценность(без.2) затем вы должны написать свой временной переменной в другом месте(нет.3). Вы должны сделать это для каждого пятна - вы хотите идти вперед - чтобы отсортировать переменные в правильном месте.
С сортировка вставками вы ставите переменную, чтобы разобраться во временную переменную, а затем положить все переменные перед места 1 место назад, пока вы не достигнете правильное место для переменной. Что делает 1 расключение стоимость проживания. В конце концов вы пишите свой темп-переменная на месте.
Что делает гораздо меньше задания значение, слишком.
Это'т сильнейших скорости-благо, но я думаю, что это может быть упомянуто.
Надеюсь, я высказался понятно, если нет, извините, я'м не Натив Великобритания
Пузырь вроде не в сети (он не может сортировать поток входных данных, не зная, сколько элементов будет), поскольку оно не отслеживать глобальный максимум отсортированные элементы. Когда элемент вставляется вы должны начать пузыриться с самого начала
Основным преимуществом вставка сортировки является то, что она's онлайн алгоритм. Вы Don'т иметь все значения в начале. Это может быть полезно, при работе с данными из сети, или какой-то сенсор.
У меня такое ощущение, что это будет быстрее, чем другие обычные N журнал(N)
алгоритмы. Ввиду сложности будет равняться n*(n журнал(N))
например, чтение/хранение каждого значения из потока (о(n)
) и затем сортировка всех значений (за o(n журнал(N))
) в результате в О(N^2 журнал(N))
Наоборот, используя вставки вроде должен о(n)
для считывания значения из потока и o(Н)
, чтобы положить значение в нужное место, таким образом, он'ы о(N^2)
только. Другое преимущество заключается в том, что вы Don'т нужна буферов для хранения ценностей, вы сортируете их в конечный пункт назначения.
ну пузырьковой сортировки-это лучше, чем сортировка вставками только тогда, когда кто-то ищет топ k элементов из большого списка номер т. е. в пузырьковой сортировки после итераций K вы'll получают топ k элементов. Однако после итерации K в сортировка вставками, это только убеждает, что эти k элементов упорядочены.
Хотя обе сортировки являются O(N^2), скрытые константы намного меньше в сортировке Insertion. Скрытые константы относятся к фактическому количеству выполняемых примитивных операций.
Когда сортировка вставкой имеет лучшее время работы?
Чтобы получить лучшее из двух миров, вы можете использовать сортировку вставкой, если массив небольшого размера, и, вероятно, сортировку слиянием (или квиксорт) для больших массивов.
Сортировка пузырьком-это почти бесполезно при любых обстоятельствах. В использовать случаях, когда сортировка вставками может иметь слишком много свопы, выбор сортировки могут быть использованы, потому что это гарантирует меньше, чем n раз подкачки. Потому что вроде выбор лучше, чем пузырьковой сортировки, сортировки пузырьком не имеет вариантов использования.
сортировка вставками:
1.В сортировка вставками замены не требуется.
2.временная сложность сортировки вставками является Ω(N)в лучшем случае и o(п^2) в худшем случае.
3.менее сложный по сравнению с пузырьковой сортировки.
4.пример: вставка книг в библиотеке, организовать карты.
пузырьковой сортировки: 1.Замена требуется в пузырьковой сортировки.
2.сложность пузырьковой сортировки является Ω(N)в лучшем случае и o(п^2) в худшем случае.
3.более сложной по сравнению с сортировка вставками.
Сортировка вставки может быть возобновлена как " Найдите элемент, который должен быть на первой позиции (минимальной), освободите место, сдвигая следующие элементы, и поместите его на первую позицию. Хорошо. Теперь посмотрите на элемент, который должен быть на 2-й позиции...." и так далее...
Пузырьковая сортировка работает по-другому, что можно представить как "Когда я нахожу два соседних элемента, расположенных в неправильном порядке, я меняю их местами".