Отойдите от пузырьков и корзин: Сортировка в ведрах - самая быстрая сортировка!

Не уходите, потому что алгоритм сортировки ведра - это, возможно, лучший метод сортировки в мире продуктов.

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

В этой статье о сортировке ведер

Что же представляет собой метод сортировки ведер?

Если предположить, что вам нужно отсортировать данные в массиве, то сортировка по ведрам - отличная отправная точка. Если она подходит для ваших нужд, не ищите дальше - ваши поиски окончены!

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

Bucket Sort работает по последнему методу, то есть по методу bin sort. Давайте рассмотрим подробнее, чем она отличается от сортировки бинов, прежде чем показать, почему сортировка ведер так хороша.

Итак, допустим, у нас есть массив, содержащий 10 целых чисел, это наши ведра. У нас есть счетчик, который действует как количество элементов в каждом ведре - поэтому при запуске этот счетчик равен количеству элементов в нашем массиве, т.е. 10.

Прежде чем мы начнем сортировать этот массив, давайте заполним каждое ведро одним и тем же значением - целым значением от 0 до 9 включительно.

Теперь, когда все 5 ведер заполнены, пора переходить к сортировке. Как узнать, какой объем имеет каждое ведро? Каждое ведро будет вмещать удвоенное количество значений, находящихся в нем в данный момент, т.е. 2n, где n = 0...9 (10 ведер). Причина удвоения заключается в том, что когда вы заглянете в одно ведро, чтобы посмотреть, находится ли там искомое значение, оно займет только 1/10 часть пространства.

Например, ведро 5 содержит 8 значений (8 * 2), а следующее наименьшее ведро, содержащее два значения, - 4 (4 * 2). Видите ли вы, как это удваивается по всему пути?

Если посмотреть на наше первое значение, подлежащее сортировке, т.е. 5... мы знаем, что поиск внутри ведра №5 займет лишь крошечную долю секунды из-за его малой емкости. Теперь допустим, мы хотим найти, где находится 34 в нашем массиве - ну, поиск внутри ведра №34 не займет даже 0,000000001 секунды! Это займет вечность, потому что там 100000 значений!

Хорошо, я думаю, вы поняли суть. Теперь давайте рассмотрим альтернативные варианты сортировки ведра.

История алгоритма сортировки ведра

Когда же появился этот метод? Считается, что метод Bucket Sort был изобретен в 1955 году, но позже выяснилось, что он существует по крайней мере с 1945 года.

Он начал набирать обороты в 1970-х годах, но не получил широкого распространения до 1995 года, когда скорость компьютеров действительно начала расти.

В настоящее время bucket sort стал одним из самых популярных алгоритмов сортировки - третьим после merge sort и quick sort! Хотя это может показаться не очень важным, поскольку и bin sort, и bucket sort в общем случае имеют быстродействие O(n * log(n)), если ваши данные велики, вы в любом случае захотите использовать bucket sort из-за его эффективного способа проведения сравнений.

Что такое сортировка бинов и пузырьков?

В Bin Sort идея заключается в том, чтобы иметь отдельную "область" для каждого сортируемого значения. Вот пример реализации сортировки по бинам:

Эта реализация, вероятно, не быстрее, чем Bucket Sort, и имеет практически ту же временную сложность, что и bucket sort, но что, если бы мы могли сбрить этот маленький кусочек лишнего? Ну, мы можем!

Bubble Sort vs Bucket Sort - Как Bubble Sort вписывается в это уравнение?

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

Пузырьковая сортировка против ведерной сортировки - почему ведерная сортировка быстрее?

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

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

Теперь, что если мы позволим сортировке по ведрам хранить 10 ведер со 100000 элементами в каждом? Сколько времени теперь потребуется для сортировки ведер? O(n) (линейное)!

Именно так. Точно так же, как если бы мы выполняли линейный поиск в массиве из 100000 целых чисел! Все разветвления и проверки, которые алгоритм сортировки ведер делает за кулисами, можно свести к "является ли это целое число меньше или больше того, которое я ищу - которое также было бы найдено с помощью линейного поиска".

Ведро Сортировка Big O

Bucket Sort Big O в нотации O(n + n * k), где n = количество элементов в массиве и k = количество ведер.

Временная сложность сортировки ведра

Временная сложность сортировки ведер является функцией количества ведер. Сортировка с одним ведром будет занимать постоянное время, но сортировка с более чем одним ведром будет иметь аддитивное время работы, поскольку на каждом шаге всегда выполняются две операции: 1) проверка того, был ли уже помещен элемент, и 2) помещение его в нужное место. Выбор этого постоянного мультипликативного коэффициента зависит от вас - насколько большими вы хотите видеть свои структуры данных? Вообще говоря, оптимизация, подобная этой, может не понадобиться, пока мы не достигнем очень большого количества элементов.

Сортировка ведра Java

Чтобы реализовать алгоритм сортировки ведра в java, вам нужно сначала создать структуру данных ведра - такую, которая может содержать по крайней мере столько элементов, сколько будет передано ей. Самым простым способом, вероятно, будет использование ArrayList с возможностью автоматического расширения, но если вы предпочитаете связные списки или что-то еще, это ваше дело! Я здесь не для того, чтобы рассказать вам, как программировать собственные алгоритмы сортировки...

import java.util.*; class BucketSort { /** * @param args the command line arguments */ public static void main(String[] args) { // TODO code application logic here List<Integer> arr = new ArrayList<Integer>(); for (int i = 0; i < 100000; i++) { arr.add(i); } Bucket sortBucketSort = new BucketSort(); String bucketName = “”; int[] bucketArray = null; System.out.println(“Please input the number of buckets you would like to use.”); int bucketNumInput = Integer.parseInt( JOptionPane.showInputDialog(“How many buckets do you want?”)); if (bucketNumInput < 1) { JOptionPane.showMessageDialog(null, “Invalid Number”); return; } if (arr == null) { arr = new ArrayList<Integer>(); } bucketArray=new int [bucketNumInput]; for (int i=0; i<bucketNumInput ;i++){ bucketArray [i]=arr.size(); } Arrays.sort(bucketArray); for (int i=0; i<bucketArray.length-1; i++) { bucketName = Integer.toString(bucketArray [i]); System.out.println(“Working on bucket ” + bucketName); // inserts data from array to proper location int j = 0; while (j < arr.size()) { if (arr.get(j) > bucketArray [i+1]) { break; } else if (arr.get(j) <= bucketArray [i+1]) { continue; } else { arr.set(j, bucketArray [i+1]); j++; } } bucketArray [i] = arr.size(); // delete from array } System.out.println(“All done!”); for (int i=0; i<bucketArray.length-1; i++) { System.out.println(“Working on bucket ” + bucketName); System.out .print(bucketName + “, you have ” + arr.get(bucketArray [i])); if (arr.get(bucketArray [i]) != 0) { bucketName = Integer .toString(bucketArray [i]); System.out .print(“Removing ” + bucketName); arr .remove(bucketArray [i]); }

Фух! Это длинная строка кода

Алгоритм Bucket Sort - самый быстрый алгоритм сортировки на...

Итак, теперь вы знаете, что такое алгоритм Bucket Sort. Это действительно быстрый способ сортировки больших фрагментов данных, который особенно полезен при сортировке данных в памяти. Используя алгоритм ведерной сортировки, вы можете быстро отсортировать 100000 целых чисел - это невозможно для всех других алгоритмов сортировки! Что вы думаете? Будете ли вы использовать этот алгоритм для быстрой сортировки впредь?

tl;dv для бизнеса
tl;dv помогает вам (наконец-то) получать пользу от собраний в масштабах всей организации. Записывайте, расшифровывайте, обобщайте, генерируйте и автоматизируйте полезные для вас и вашей организации сведения о совещаниях. Настройте систему за несколько минут.
Неограниченное количество записей и стенограмм
Краткие сведения об искусственном интеллекте
Спросите tl;dv AI
Работает на +30 языках
Отчеты ИИ для нескольких заседаний
+5000 интеграций