Как сортировка пузырьков сравнивается с сортировкой выбора? - PullRequest
4 голосов
/ 30 декабря 2010

Какая техника сортировки быстрее: пузырьковая или выборочная, и почему? Оба одинаково эффективны?

Ответы [ 6 ]

12 голосов
/ 30 декабря 2010

Википедия говорит (выделение добавлено):

Среди простых алгоритмов average (n 2 ) среднего значения выбор сортировки почти всегдапревосходит пузырьковую сортировку и сортировку гномов, но обычно опережает сортировку вставкой.Сортировка вставок очень похожа тем, что после k-й итерации первые k элементов в массиве расположены в отсортированном порядке.Преимущество сортировки вставкой состоит в том, что она сканирует столько элементов, сколько необходимо для размещения элемента k + 1st, а сортировка выбора должна сканировать все оставшиеся элементы, чтобы найти элемент k + 1st.

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

Хотя сортировка выбора предпочтительнее сортировки вставкой с точки зрения количествапишет (Θ (n) свопы против Ο (n 2 ) свопов), оно почти всегда намного превышает (и никогда не бьет) количество записей, которые выполняет сортировка цикла, поскольку сортировка цикла теоретически оптимальна по числуиз пишет.Это может быть важно, если записи значительно дороже, чем чтение, например, с EEPROM или флэш-памятью, где каждая запись уменьшает срок службы памяти.

Наконец, сортировка выбора значительно превосходит на больших массивах на Θ (n log n) разделяй и властвуй алгоритмы, такие как сортировка слиянием.Однако сортировка вставкой или сортировка выбора обычно выполняются быстрее для небольших массивов (т. Е. Менее 10-20 элементов).Полезная оптимизация на практике для рекурсивных алгоритмов состоит в том, чтобы переключиться на сортировку вставки или сортировку выбора для «достаточно маленьких» подсписков.

И, Википедия по пузырьковая сортировка (выделение добавлено):

Пузырьковая сортировка имеет наихудший случай и среднюю сложность как О (n 2 ), где n - количество сортируемых элементов.Существует много алгоритмов сортировки с существенно лучшей наихудшей или средней сложностью O (n log n).Даже другие алгоритмы сортировки О (n 2 ), такие как сортировка вставкой, имеют тенденцию иметь лучшую производительность, чем пузырьковая сортировка.Следовательно, пузырьковая сортировка не является практическим алгоритмом сортировки, когда n велико.

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

5 голосов
/ 19 октября 2015

Сортировка выбора выполняет меньшее количество операций замены по сравнению с пузырьковой сортировкой; следовательно, хотя оба метода сортировки имеют O (N 2 ), сортировка выбора выполняется быстрее и эффективнее!

1 голос
/ 24 апреля 2018

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

0 голосов
/ 06 июня 2019

Bubble sort использует больше времени подкачки, в то время как сортировка выбора избегает этого.

При использовании sort сортировка не меняет n раз.но при использовании пузырьковой сортировки он меняет местами почти n * (n-1).И, очевидно, время чтения меньше, чем время записи даже в памяти.Время сравнения и другое время выполнения можно игнорировать.Так что время подкачки является критическим узким местом проблемы.

0 голосов
/ 02 октября 2018

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

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

Ответ, основанный исключительно на проверке моих собственных и других реализаций,является то, что пузырьковая сортировка делает обмен значениями (чтение, запись, запись) в КАЖДОМ ОДНОМ ХРИСТЕ СРАВНЕНИЯ.Выбор сортировки просто записывает новое граничное значение (мин для восходящей сортировки, макс для убывания), а затем заменяет его в конце прохода.

void swapInt(int *ptr1, int *ptr2) {
   int temp;

   temp = *ptr1;
   *ptr1 = *ptr2;
   *ptr2 = temp;
}

/* compare and swap over a shrinking sub-array */
void bubbleSortArray(int a[], const int aSize) {
   int unsorted, i, iMax = (aSize - 1);

   do {
      unsorted = 0;
      for (i = 0; i < iMax; i++) {
         if ( a[i] > a[i + 1] ) {
            unsorted = 1;
            /* swap every time comparison is true */
            swapInt(&a[i], &a[i + 1]);
         }
      }
      --iMax;
   } while (unsorted);
}

/* compare to find min value, write it before shrinking the sub-array */
void selectSortArray(int a[], const int aSize) {
   int i, j, mindex;

   for (i = 0; i < (aSize - 1); i++) {
      mindex = i;
      for (j = (i + 1); j < aSize; j++) {
         if ( a[j] < a[mindex] ) mindex = j;
      }
      /* swap after inner loop terminates */
      swapInt(&a[i], &a[mindex]);
   }
}
0 голосов
/ 30 декабря 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...