Карманная сортировка — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
Строка 41: Строка 41:
 
==Примечания==
 
==Примечания==
 
Сортировка быстро работает для равновероятного распределения значений разрядов объектов в заданной для них системы счисления.
 
Сортировка быстро работает для равновероятного распределения значений разрядов объектов в заданной для них системы счисления.
В случаи разбиения всех элементов на <tex>2 </tex> "кармана", [[Быстрая сортировка|быстрая сортировка]] является частным случаем "карманной" сортировкой.Также стоит отметить, что по принципу своей работы Bucket sort схожа с [[Цифровая сортировка|Цифровой сортировкой]].
+
[[Быстрая сортировка|быстрая сортировка]] является частным случаем "карманной" сортировкой, в случаи разбиения всех элементов на <tex>2 </tex> "кармана",.Также стоит отметить, что по принципу своей работы Bucket sort схожа с [[Цифровая сортировка|Цифровой сортировкой]].
 
==Ссылки==
 
==Ссылки==
 
* http://en.wikipedia.org/wiki/Bucket_sort
 
* http://en.wikipedia.org/wiki/Bucket_sort

Версия 18:12, 10 июня 2012

Карманная сортировка(Bucket sort) — алгоритм сортировки , основанный на предположение о равномерном распределении входных данных.

Алгоритм сортировки

Принцип работы алгоритма вообщем

Пример работы рекурсивного Bucketsort.
  • элементы массива входных данных разбивается на [math]k[/math] блоков("карманов","корзин").
  • каждый из блоков сортируется либо отдельной какой либо другой сортировкой, либо рекурсивно тем же методом разбиения.
  • Из каждого отсортированного блока записываются в массив , в порядке разбиения на блоки.

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

Реализация Алгоритма

Рассмотрим код работы алгоритма.

<wikitex>

Bucketsort(A,j){
    if (A.length() < 2 || i == p + 1)
        return A;
    buckets <- инициализируем массив длины Base , где каждая ячейка список входных объектов (в нашем случаи    
    строк.
    for i = 0  to A.length() - 1  
      добавляем A[i] в конец массива buckets[partion(A[i],j)] 
    // partion функция которая по данному объекту и индексу возвращает число от 0 до Base - 1
    // в случаи со строками функция partion возвращает код j-ого символа строки A[i].  
    for i = 0 to Base - 1
       buckets[i] = Bucketsort(buckets[i],j+1)
    answer <- инициализируем пустой массив(в который записывается отсортированный набор данных)
    for i = 0 to Base - 1
       for k = 0 to buckets[i].length() - 1
          добавляем  buckets[i][k] в конец массива answer
    return answer
}

</wikitex> Base - основание системы счисления в случаи со строками Base = 256.

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

Асимптотика

Пусть [math]n[/math] количество элементов в массиве, [math]k[/math] основание системы исчисления и [math]p[/math] количество разрядов в объекте. Тогда алгоритм "Bucket sort" в процессе работы, сделает не более чем [math]O(p * (n + k))[/math] итераций. Заметим ,что в случаи случайного распределения мат. ожидания количество элементов в каждом блоке [math] n/k[/math]. Следовательно в средним алгоритм "карманной сортировки" совершает [math]O(n * log_k n)[/math] действий.При этом на некотором множестве наборов, где [math] k = O(n)[/math] , алгоритм отработает за линейное время. В худшем случаи , сортировка работает за [math]O(n^2)[/math].

Примечания

Сортировка быстро работает для равновероятного распределения значений разрядов объектов в заданной для них системы счисления.

быстрая сортировка является частным случаем "карманной" сортировкой, в случаи разбиения всех элементов на [math]2 [/math] "кармана",.Также стоит отметить, что по принципу своей работы Bucket sort схожа с Цифровой сортировкой.

Ссылки