Есть ли какое-то применение пузырьковой сортировке в реальном мире? Каждый раз, когда я вижу упоминание об одном, это всегда либо:





Вероятно, это самый быстрый из наборов крошечный.
Кстати об образовании. Ссылка на последнюю сцену сортировка сортировка, потрясающе. Должен увидеть.
+1 за то, что заставил меня крикнуть «GO QUICKSORT GO!» впервые в жизни.
В реальном мире это не так часто используется. Это хороший инструмент обучения, потому что его легко понять и быстро освоить воплощать в жизнь. У него плохой (O (n ^ 2)) худший случай и средняя производительность. Он имеет хорошую производительность в лучшем случае, когда вы знаете, что данные почти отсортированы, но есть множество других алгоритмов, которые обладают этим свойством, с лучшей производительностью в худшем и среднем случае.
Я на самом деле нахожу удивительным, что пузырьковая сортировка (часто) преподается перед сортировкой вставкой или выбором. И то, и другое, на мой взгляд, невероятно интуитивно понятно. Если я не ошибаюсь, большинство людей выбирают то или иное при сортировке игральных карт. Сортировка пузырьков требует немного больше размышлений.
Это очень давно, но я подумал, что добавлю 5 центов за всех, кто натолкнется на этот 4 комментария. Вы правы в том, что вставка сортировки выбора более интуитивна, чем попытка заставить ученика увидеть пузырь, плавающий в векторе. Однако, если у студентов мало опыта в программировании, с помощью 4 строк кода легче объяснить отображение от кода до визуализации или абстракции. Многие концепции из инварианта пузыря могут перейти, скажем, к сортировке вставкой. Например, идея движения границы по первому циклу, разделяющего массив на упорядоченный и еще не упорядоченный.
Сортировка вставкой является более интуитивной и более практичной, чем другие алгоритмы сортировки среднего случая O (n ^ 2). Фактически, для небольших списков это САМЫЙ быстрый алгоритм. И люди также используют это для сортировки карточек.
Добавить в комментарий. Насколько я понял, пузырьковая сортировка, сортировка по выделению и сортировка вставкой похожи; Все O (N ^ 2) худший случай, но каждый немного лучше, чем следующий. Таким образом, пузырьковая сортировка является наихудшей, вы можете видеть, как ее можно постепенно улучшать, когда сортировка вставкой (при частичной сортировке в нормальных условиях) в два раза быстрее, чем пузырьковая сортировка, и немного лучше, чем сортировка по выбору. Сортировка вставкой обучается до быстрой сортировки, поскольку она используется в конце быстрой сортировки. Пузырьковая сортировка = O (n ^ 2) время для сравнений и обмена, сортировка по выбору = O (n ^ 2) для сравнений, но O (n) для обмена.
Я считаю, что это хороший «обучающий» алгоритм, потому что его очень легко понять и реализовать. Это также может быть полезно для небольших наборов данных по той же причине (хотя некоторые из алгоритмов O (n lg n) тоже довольно легко реализовать).
Это зависит от того, как распространяются ваши данные - если вы можете сделать некоторые предположения.
Одна из лучших ссылок, которые я нашел, чтобы понять, когда использовать пузырьковую или какую-то другую сортировку, - это анимированное представление алгоритмов сортировки:
http://www.sorting-algorithms.com/
Мне очень нравится эта анимация! В соответствии с ним, похоже, что сортировка ракушек лучше всего подходит для размера 50.
эти анимации рок. отличный сайт
Я знаю, что этот вопрос старый, но ссылка не работает ...
@Trufa Ссылки работают. Отличный ресурс
Недавно я наткнулся на то, что он очень хорошо использовался в одном анекдоте по оптимизации. Программе требовался набор спрайтов, отсортированных по глубине в каждом кадре. Порядок spites не сильно менялся между кадрами, поэтому в целях оптимизации они были отсортированы по пузырьку с одним проходом для каждого кадра. Это было сделано в обоих направлениях (сверху вниз и снизу вверх). Таким образом, спрайты всегда почти сортировались с помощью очень эффективного алгоритма O (N).
На самом деле сортировка вставкой для этого еще лучше. Многие системы рендеринга в реальном времени используют сортировку вставкой для очень больших списков вещей по той причине, что вещи имеют тенденцию быть «почти» упорядоченными для каждого кадра. Хотя пузырьковая сортировка очень похожа.
@TM Я думаю, вы пропустили бит, где это два фиксированных прохода на кадр. В конечном итоге он будет отсортирован, но это может занять несколько (сотен) кадров. Один проход сортировки вставкой для каждого кадра гарантирует, что первый (или последний) элемент находится в нужном месте. Пузырь заставит всех спрайтов двигаться в правильное место.
Я использую его чаще всего. (В нашем проекте мы не можем использовать какие-либо внешние библиотеки.)
Это полезно, когда я точно знаю, что набор данных действительно мал, поэтому мне наплевать на скорость и мне нужен самый короткий и простой код.
Пузырь - это не самый низкий уровень. Недавно у меня была ситуация, когда мне нужно было отсортировать ровно три элемента. Я написал примерно так:
// Use sort of stooge to sort the three elements by cpFirst
SwapElementsIfNeeded(&elementTop, &elementBottom);
SwapElementsIfNeeded(&elementTop, &elementMiddle);
SwapElementsIfNeeded(&elementMiddle, &elementBottom);
*pelement1 = elementTop;
*pelement2 = elementMiddle;
*pelement3 = elementBottom;
Это хорошо для небольших наборов данных - поэтому некоторые реализации qsort переключаются на него, когда размер раздела становится небольшим. Но сортировка вставкой все еще быстрее, поэтому нет веских причин использовать ее, кроме как в качестве учебного пособия.
Я использовал его в некоторых случаях для малых N на TRS-80 Model 1. Используя цикл for, можно реализовать полную сортировку в одной строке программы.
Помимо этого, он хорош для обучения, а иногда и для списков, которые почти отсортированы.
Однажды я использовал его для случая, когда в подавляющем большинстве случаев он сортировал два элемента.
В следующий раз, когда я увидел этот код, кто-то заменил его библиотечной сортировкой. Надеюсь, они первыми проверили его!
сортировка двух предметов? (a < b)? (swap):(do-not-swap)?
@Lazer, хотя в большинстве случаев это было 2, ему все равно приходилось обрабатывать случай, когда их было больше 2. Оглядываясь назад, я мог бы рассматривать это как два разных случая с разным кодом для обработки каждого, и я был сообщил, что сортировка библиотеки в любом случае работает именно так.
Кодировать быстро и легко (ошибиться практически невозможно). В нем есть место, если вы не занимаетесь тяжелой работой и нет поддержки сортировки библиотек.
Я не могу удержаться от ответа на любые замечания о пузырьковой сортировке, упоминая более быстрый (кажется, O (nlogn), но это не совсем доказано) Расческа Сортировка. Обратите внимание, что сортировка Comb немного быстрее, если вы используете предварительно вычисленную таблицу. Сортировка гребней точно такая же, как сортировка пузырьков, за исключением того, что изначально она не начинается с замены соседних элементов. Это почти так же легко реализовать / понять, как пузырьковая сортировка.
Ах да, это хороший механизм отбора. Если вы найдете это в коде, написанном кем-то, вы не нанимаете его.
Даже если он отлично работает в конкретной ситуации?
да. Если вы можете настроить ситуацию так, чтобы пузырьковая сортировка была идеальным ответом, вы должны были бы настроить ситуацию так, чтобы это не было.
ха-ха, я уже использовал этот критерий для отклонения кандидата :)
Невероятно, сколько отрицательных голосов за это ...
@Stephan: Он получает отрицательные голоса (в том числе и мой), потому что такие общие правила не просто глупые, они просто неправильный. Пузырьковая сортировка требует очень мало инструкций, хотя во многих случаях оказывается «достаточно быстрой». Я бы определенно не стал нанимать для встраиваемого проекта никого, кто не мог бы представить себе эти свойства полезными.
Я считаю, что это работает очень хорошо. В реальной жизни он используется потому, что они не знают своих алгоритмов.
Я согласен с Николаем. Общие правила не помогают людям. Если модуль является функционально правильным, хорошо организованным, документированным и пригодным для обслуживания, но при этом использует пузырьковую сортировку вместо быстрой, это не означает, что этот человек по своей сути является нечеловеческим подонком.
Это показатель отсутствия мастерства. У нас достаточно плохого кода
@StephanEggermont Я написал пузырьковую сортировку в шаблонах C++ для сортировки числовых массивов фиксированной длины (<10). Быстрая сортировка была на много медленнее. Знайте цель кода.
@kibibu, чтобы вы знали, как писать плохой код, но при этом не знали своих алгоритмов. Я не хочу с тобой работать.
недавно мы использовали пузырьковую сортировку для доказательства оптимальности алгоритма. Нам нужно было преобразовать произвольное оптимальное решение, представленное последовательностью объектов, в решение, найденное нашим алгоритмом. Поскольку наш алгоритм был просто «Сортировать по этим критериям», нам нужно было доказать, что мы можем отсортировать оптимальное решение, не ухудшая его. В этом случае пузырьковая сортировка была очень хорошим алгоритмом для использования, потому что у нее есть хороший инвариант, заключающийся в том, что просто меняют местами два элемента, которые находятся рядом друг с другом и находятся в неправильном порядке. Думаю, использование более сложных алгоритмов растопило бы мозги.
Привет.
Пузырьковая сортировка легко реализовать, и он достаточно быстр, когда у вас небольшие наборы данных.
Сортировка пузырьков выполняется достаточно быстро, когда ваш набор почти отсортирован (например, один или несколько элементов находятся в неправильных позициях), в этом случае вам лучше чередовать переходы от 0-индекса до n-индекса и от n-индекса до 0-индекса . С помощью C++ это можно реализовать следующим образом:
void bubbleSort(vector<int>& v) { // sort in ascending order
bool go = true;
while (go) {
go = false;
for (int i = 0; i+1 < v.size(); ++i)
if (v[i] > v[i+1]) {
swap(v[i], v[j]);
go = true;
}
for (int i = (int)v.size()-1; i > 0; --i)
if (v[i-1] > v[i]) {
swap(v[i-1], v[i]);
go = true;
}
}
}
Это может быть хорошо, если замена двух соседних элементов является фишкой, а замена произвольных элементов стоит дорого.
Поскольку этот алгоритм легко реализовать, его легко поддерживать, и в реальном жизненном цикле приложения важно сократить усилия по поддержке.
Поддерживать нелегко. Каждый настоящий программист почувствует почти непреодолимое желание как можно скорее заменить его :)
В основном ничего такого. Вместо этого используйте QuickSort или SelectionSort ...!
Пузырьковая сортировка (доказуемо) самая быстрая сортировка, доступная при определенных обстоятельствах очень. Первоначально он стал хорошо известен прежде всего потому, что это был один из первых алгоритмов (любого типа), который был тщательно проанализирован, и было найдено доказательство того, что он был оптимальным в своих ограниченных обстоятельствах.
Рассмотрим файл, хранящийся на ленточном накопителе, и настолько мало оперативной памяти (или такие большие ключи), что вы можете загружать в память только записи два в любой момент времени. Перемотка ленты происходит достаточно медленно, поэтому произвольный доступ к файлу обычно нецелесообразен - если возможно, вы хотите обрабатывать записи последовательно, не более двух за раз.
Раньше, когда ленточные накопители были обычным явлением, а машины с несколькими тысячами (слова | байты) ОЗУ (любого типа) были обычным явлением, это было достаточно реалистично, чтобы его стоило изучить. Это обстоятельство сейчас встречается редко, поэтому изучение пузырьковой сортировки вообще не имеет смысла - но, что еще хуже, обстоятельства, когда она оптимальна, все равно не учат, поэтому даже когда / если возникнет правильная ситуация, почти никто не будет понимать.
Поскольку это самый быстрый на очень маленьком и / или почти отсортированном наборе данных, хотя это может скрыть слабость пузырьковой сортировки (по крайней мере, до некоторой степени), сортировка вставкой по существу всегда будет лучше для любого / обоих из те.
Но если бы вы могли сэкономить лишнюю ленту, сортировка слиянием все равно побила бы ее.
@Mark: О, да - ослабьте почти Любые ограничений, и Bubblesort почти всегда проигрывает, и обычно очень плохо.
Не могли бы вы более подробно объяснить пример вашего накопителя на магнитной ленте?
@gen: Я не знаю, что добавить. Что вам непонятно?
@gen Я считаю, что определяющее ограничение заключается в следующем: пузырьковая сортировка хороша, когда последовательный доступ намного быстрее, чем произвольный доступ, и вы можете хранить только два объекта в памяти. С ленточным накопителем механически уже движется последовательно, так что вы можете делать столько работы, сколько сможете, пока он это делает, без замедления / остановки / реверсирования ленточного устройства.
Разве для этой цели не лучше сорт коктейлей?
@Akangka: Это даже достойный кандидат, если вы можете читать ленту задом наперед, чего не было в исходной спецификации. Если вы можете читать в обратном направлении (без каких-либо штрафов), это может быть улучшением.
Разве в таком случае сортировка вставкой не была бы лучше?
@Hedede: Когда вы сможете читать ленту задом наперед? Да, возможно.
Нет это не так. Не следует обучать начинающих программистов, как и goto.