Для чего нужна пузырьковая сортировка?

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

  1. Алгоритм сортировки для изучения.
  2. Пример используемого алгоритма сортировки нет.
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
50
0
48 515
16
Перейти к ответу Данный вопрос помечен как решенный

Ответы 16

Вероятно, это самый быстрый из наборов крошечный.

Кстати об образовании. Ссылка на последнюю сцену сортировка сортировка, потрясающе. Должен увидеть.

Нет это не так. Не следует обучать начинающих программистов, как и goto.

Stephan Eggermont 30.11.2008 00:05

+1 за то, что заставил меня крикнуть «GO QUICKSORT GO!» впервые в жизни.

Juliet 14.11.2009 08:55

В реальном мире это не так часто используется. Это хороший инструмент обучения, потому что его легко понять и быстро освоить воплощать в жизнь. У него плохой (O (n ^ 2)) худший случай и средняя производительность. Он имеет хорошую производительность в лучшем случае, когда вы знаете, что данные почти отсортированы, но есть множество других алгоритмов, которые обладают этим свойством, с лучшей производительностью в худшем и среднем случае.

Я на самом деле нахожу удивительным, что пузырьковая сортировка (часто) преподается перед сортировкой вставкой или выбором. И то, и другое, на мой взгляд, невероятно интуитивно понятно. Если я не ошибаюсь, большинство людей выбирают то или иное при сортировке игральных карт. Сортировка пузырьков требует немного больше размышлений.

Thomas Eding 11.10.2011 02:26

Это очень давно, но я подумал, что добавлю 5 центов за всех, кто натолкнется на этот 4 комментария. Вы правы в том, что вставка сортировки выбора более интуитивна, чем попытка заставить ученика увидеть пузырь, плавающий в векторе. Однако, если у студентов мало опыта в программировании, с помощью 4 строк кода легче объяснить отображение от кода до визуализации или абстракции. Многие концепции из инварианта пузыря могут перейти, скажем, к сортировке вставкой. Например, идея движения границы по первому циклу, разделяющего массив на упорядоченный и еще не упорядоченный.

Oeufcoque Penteano 23.12.2013 01:28

Сортировка вставкой является более интуитивной и более практичной, чем другие алгоритмы сортировки среднего случая O (n ^ 2). Фактически, для небольших списков это САМЫЙ быстрый алгоритм. И люди также используют это для сортировки карточек.

Xwtek 15.08.2018 06:06

Добавить в комментарий. Насколько я понял, пузырьковая сортировка, сортировка по выделению и сортировка вставкой похожи; Все O (N ^ 2) худший случай, но каждый немного лучше, чем следующий. Таким образом, пузырьковая сортировка является наихудшей, вы можете видеть, как ее можно постепенно улучшать, когда сортировка вставкой (при частичной сортировке в нормальных условиях) в два раза быстрее, чем пузырьковая сортировка, и немного лучше, чем сортировка по выбору. Сортировка вставкой обучается до быстрой сортировки, поскольку она используется в конце быстрой сортировки. Пузырьковая сортировка = O (n ^ 2) время для сравнений и обмена, сортировка по выбору = O (n ^ 2) для сравнений, но O (n) для обмена.

eaglei22 12.04.2019 01:33

Я считаю, что это хороший «обучающий» алгоритм, потому что его очень легко понять и реализовать. Это также может быть полезно для небольших наборов данных по той же причине (хотя некоторые из алгоритмов O (n lg n) тоже довольно легко реализовать).

Ответ принят как подходящий

Это зависит от того, как распространяются ваши данные - если вы можете сделать некоторые предположения.

Одна из лучших ссылок, которые я нашел, чтобы понять, когда использовать пузырьковую или какую-то другую сортировку, - это анимированное представление алгоритмов сортировки:

http://www.sorting-algorithms.com/

Мне очень нравится эта анимация! В соответствии с ним, похоже, что сортировка ракушек лучше всего подходит для размера 50.

lkessler 09.11.2008 20:09

эти анимации рок. отличный сайт

Johannes Schaub - litb 30.11.2008 01:35
sorting-algorithms.com также имеет хорошие анимации!
RCIX 14.11.2009 08:37

Я знаю, что этот вопрос старый, но ссылка не работает ...

Trufa 17.04.2011 01:55

@Trufa Ссылки работают. Отличный ресурс

Chen A. 30.09.2017 12:12

Недавно я наткнулся на то, что он очень хорошо использовался в одном анекдоте по оптимизации. Программе требовался набор спрайтов, отсортированных по глубине в каждом кадре. Порядок spites не сильно менялся между кадрами, поэтому в целях оптимизации они были отсортированы по пузырьку с одним проходом для каждого кадра. Это было сделано в обоих направлениях (сверху вниз и снизу вверх). Таким образом, спрайты всегда почти сортировались с помощью очень эффективного алгоритма O (N).

На самом деле сортировка вставкой для этого еще лучше. Многие системы рендеринга в реальном времени используют сортировку вставкой для очень больших списков вещей по той причине, что вещи имеют тенденцию быть «почти» упорядоченными для каждого кадра. Хотя пузырьковая сортировка очень похожа.

TM. 10.11.2008 01:55

@TM Я думаю, вы пропустили бит, где это два фиксированных прохода на кадр. В конечном итоге он будет отсортирован, но это может занять несколько (сотен) кадров. Один проход сортировки вставкой для каждого кадра гарантирует, что первый (или последний) элемент находится в нужном месте. Пузырь заставит всех спрайтов двигаться в правильное место.

kibibu 10.12.2013 04:09

Я использую его чаще всего. (В нашем проекте мы не можем использовать какие-либо внешние библиотеки.)

Это полезно, когда я точно знаю, что набор данных действительно мал, поэтому мне наплевать на скорость и мне нужен самый короткий и простой код.

Пузырь - это не самый низкий уровень. Недавно у меня была ситуация, когда мне нужно было отсортировать ровно три элемента. Я написал примерно так:

// 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 18.07.2010 08:51

@Lazer, хотя в большинстве случаев это было 2, ему все равно приходилось обрабатывать случай, когда их было больше 2. Оглядываясь назад, я мог бы рассматривать это как два разных случая с разным кодом для обработки каждого, и я был сообщил, что сортировка библиотеки в любом случае работает именно так.

Mark Ransom 18.07.2010 08:57

Кодировать быстро и легко (ошибиться практически невозможно). В нем есть место, если вы не занимаетесь тяжелой работой и нет поддержки сортировки библиотек.

Я не могу удержаться от ответа на любые замечания о пузырьковой сортировке, упоминая более быстрый (кажется, O (nlogn), но это не совсем доказано) Расческа Сортировка. Обратите внимание, что сортировка Comb немного быстрее, если вы используете предварительно вычисленную таблицу. Сортировка гребней точно такая же, как сортировка пузырьков, за исключением того, что изначально она не начинается с замены соседних элементов. Это почти так же легко реализовать / понять, как пузырьковая сортировка.

Ах да, это хороший механизм отбора. Если вы найдете это в коде, написанном кем-то, вы не нанимаете его.

Даже если он отлично работает в конкретной ситуации?

pierrotlefou 14.11.2009 09:20

да. Если вы можете настроить ситуацию так, чтобы пузырьковая сортировка была идеальным ответом, вы должны были бы настроить ситуацию так, чтобы это не было.

Stephan Eggermont 15.11.2009 12:55

ха-ха, я уже использовал этот критерий для отклонения кандидата :)

sergtk 06.12.2009 12:48

Невероятно, сколько отрицательных голосов за это ...

Stephan Eggermont 17.01.2010 14:26

@Stephan: Он получает отрицательные голоса (в том числе и мой), потому что такие общие правила не просто глупые, они просто неправильный. Пузырьковая сортировка требует очень мало инструкций, хотя во многих случаях оказывается «достаточно быстрой». Я бы определенно не стал нанимать для встраиваемого проекта никого, кто не мог бы представить себе эти свойства полезными.

Nicholas Knight 18.07.2010 06:53

Я считаю, что это работает очень хорошо. В реальной жизни он используется потому, что они не знают своих алгоритмов.

Stephan Eggermont 19.07.2010 01:40

Я согласен с Николаем. Общие правила не помогают людям. Если модуль является функционально правильным, хорошо организованным, документированным и пригодным для обслуживания, но при этом использует пузырьковую сортировку вместо быстрой, это не означает, что этот человек по своей сути является нечеловеческим подонком.

Skrylar 19.08.2013 23:23

Это показатель отсутствия мастерства. У нас достаточно плохого кода

Stephan Eggermont 07.09.2013 01:01

@StephanEggermont Я написал пузырьковую сортировку в шаблонах C++ для сортировки числовых массивов фиксированной длины (<10). Быстрая сортировка была на много медленнее. Знайте цель кода.

kibibu 10.12.2013 04:15

@kibibu, чтобы вы знали, как писать плохой код, но при этом не знали своих алгоритмов. Я не хочу с тобой работать.

Stephan Eggermont 03.01.2014 19:23

недавно мы использовали пузырьковую сортировку для доказательства оптимальности алгоритма. Нам нужно было преобразовать произвольное оптимальное решение, представленное последовательностью объектов, в решение, найденное нашим алгоритмом. Поскольку наш алгоритм был просто «Сортировать по этим критериям», нам нужно было доказать, что мы можем отсортировать оптимальное решение, не ухудшая его. В этом случае пузырьковая сортировка была очень хорошим алгоритмом для использования, потому что у нее есть хороший инвариант, заключающийся в том, что просто меняют местами два элемента, которые находятся рядом друг с другом и находятся в неправильном порядке. Думаю, использование более сложных алгоритмов растопило бы мозги.

Привет.

Пузырьковая сортировка легко реализовать, и он достаточно быстр, когда у вас небольшие наборы данных.

Сортировка пузырьков выполняется достаточно быстро, когда ваш набор почти отсортирован (например, один или несколько элементов находятся в неправильных позициях), в этом случае вам лучше чередовать переходы от 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;
      }
  }
}

Это может быть хорошо, если замена двух соседних элементов является фишкой, а замена произвольных элементов стоит дорого.

Дональд Кнут в своем знаменитом «Искусство компьютерного программирования» пришел к выводу, что «пузырьковой сортировке, похоже, нет ничего, что можно было бы рекомендовать, кроме броского названия и того факта, что оно приводит к некоторым интересным теоретическим проблемам»..

Поскольку этот алгоритм легко реализовать, его легко поддерживать, и в реальном жизненном цикле приложения важно сократить усилия по поддержке.

Поддерживать нелегко. Каждый настоящий программист почувствует почти непреодолимое желание как можно скорее заменить его :)

Stephan Eggermont 07.12.2008 02:15

В основном ничего такого. Вместо этого используйте QuickSort или SelectionSort ...!

Пузырьковая сортировка (доказуемо) самая быстрая сортировка, доступная при определенных обстоятельствах очень. Первоначально он стал хорошо известен прежде всего потому, что это был один из первых алгоритмов (любого типа), который был тщательно проанализирован, и было найдено доказательство того, что он был оптимальным в своих ограниченных обстоятельствах.

Рассмотрим файл, хранящийся на ленточном накопителе, и настолько мало оперативной памяти (или такие большие ключи), что вы можете загружать в память только записи два в любой момент времени. Перемотка ленты происходит достаточно медленно, поэтому произвольный доступ к файлу обычно нецелесообразен - если возможно, вы хотите обрабатывать записи последовательно, не более двух за раз.

Раньше, когда ленточные накопители были обычным явлением, а машины с несколькими тысячами (слова | байты) ОЗУ (любого типа) были обычным явлением, это было достаточно реалистично, чтобы его стоило изучить. Это обстоятельство сейчас встречается редко, поэтому изучение пузырьковой сортировки вообще не имеет смысла - но, что еще хуже, обстоятельства, когда она оптимальна, все равно не учат, поэтому даже когда / если возникнет правильная ситуация, почти никто не будет понимать.

Поскольку это самый быстрый на очень маленьком и / или почти отсортированном наборе данных, хотя это может скрыть слабость пузырьковой сортировки (по крайней мере, до некоторой степени), сортировка вставкой по существу всегда будет лучше для любого / обоих из те.

Но если бы вы могли сэкономить лишнюю ленту, сортировка слиянием все равно побила бы ее.

Mark Ransom 12.07.2011 02:27

@Mark: О, да - ослабьте почти Любые ограничений, и Bubblesort почти всегда проигрывает, и обычно очень плохо.

Jerry Coffin 12.07.2011 02:39

Не могли бы вы более подробно объяснить пример вашего накопителя на магнитной ленте?

gen 03.12.2013 22:08

@gen: Я не знаю, что добавить. Что вам непонятно?

Jerry Coffin 03.12.2013 22:26

@gen Я считаю, что определяющее ограничение заключается в следующем: пузырьковая сортировка хороша, когда последовательный доступ намного быстрее, чем произвольный доступ, и вы можете хранить только два объекта в памяти. С ленточным накопителем механически уже движется последовательно, так что вы можете делать столько работы, сколько сможете, пока он это делает, без замедления / остановки / реверсирования ленточного устройства.

kibibu 10.12.2013 04:05

Разве для этой цели не лучше сорт коктейлей?

Xwtek 15.08.2018 06:00

@Akangka: Это даже достойный кандидат, если вы можете читать ленту задом наперед, чего не было в исходной спецификации. Если вы можете читать в обратном направлении (без каких-либо штрафов), это может быть улучшением.

Jerry Coffin 15.08.2018 06:29

Разве в таком случае сортировка вставкой не была бы лучше?

Hedede 03.01.2019 21:53

@Hedede: Когда вы сможете читать ленту задом наперед? Да, возможно.

Jerry Coffin 03.01.2019 21:55

Другие вопросы по теме