Карманная сортировка — различия между версиями
Daniel (обсуждение | вклад)  | 
				Daniel (обсуждение | вклад)   | 
				||
| Строка 1: | Строка 1: | ||
| − | '''Карманная сортировка'''(Bucket sort)  — алгоритм сортировки , основанный на предположении о равномерном распределении входных данных.  | + | '''Карманная сортировка''' (Bucket sort)  — алгоритм сортировки , основанный на предположении о равномерном распределении входных данных.  | 
== Алгоритм сортировки ==  | == Алгоритм сортировки ==  | ||
=== Принцип работы ===  | === Принцип работы ===  | ||
| Строка 7: | Строка 7: | ||
* каждый из блоков сортируется либо другой сортировкой, либо рекурсивно тем же методом разбиения.  | * каждый из блоков сортируется либо другой сортировкой, либо рекурсивно тем же методом разбиения.  | ||
*  из каждого отсортированного блока данные  записываются в массив в порядке разбиения на блоки.  | *  из каждого отсортированного блока данные  записываются в массив в порядке разбиения на блоки.  | ||
| − | Важно отметить ,что разбиение на блоки производится таким образом, чтобы элементы каждого следующего блока были бы больше предыдущего.  | + | Важно отметить, что разбиение на блоки производится таким образом, чтобы элементы каждого следующего блока были бы больше предыдущего.  | 
=== Реализация ===  | === Реализация ===  | ||
Рассмотрим код работы алгоритма, где <tex> p </tex> — длина каждой строки.  | Рассмотрим код работы алгоритма, где <tex> p </tex> — длина каждой строки.  | ||
<wikitex>  | <wikitex>  | ||
| − |   Bucketsort(A, j){ // A - массив данных, j - текущий разряд  | + |   Bucketsort (A, j){ // A - массив данных, j - текущий разряд  | 
| − |       if (A.length  | + |       if (A.length < 2 || j == p + 1)  | 
          return A;  |           return A;  | ||
      buckets <- инициализируем массив длины Base, где каждая ячейка — список входных объектов (в нашем случае       |       buckets <- инициализируем массив длины Base, где каждая ячейка — список входных объектов (в нашем случае       | ||
      строк).  |       строк).  | ||
| − |       for i = 0  to A.length  | + |       for i = 0  to A.length - 1     | 
| − |         добавляем A[i] в конец массива buckets[partition(A[i],j)]    | + |         добавляем A[i] в конец массива buckets[partition (A[i], j)]    | 
      // partition — функция которая по данному объекту и индексу возвращает число от 0 до Base - 1  |       // partition — функция которая по данному объекту и индексу возвращает число от 0 до Base - 1  | ||
      // в случае со строками функция partition возвращает код j-ого символа строки A[i].     |       // в случае со строками функция partition возвращает код j-ого символа строки A[i].     | ||
      for i = 0 to Base - 1  |       for i = 0 to Base - 1  | ||
| − |          buckets[i] = Bucketsort(buckets[i],j+1)  | + |          buckets[i] = Bucketsort (buckets[i],j+1)  | 
      answer <- инициализируем пустой массив (в который записывается отсортированный набор данных)  |       answer <- инициализируем пустой массив (в который записывается отсортированный набор данных)  | ||
      for i = 0 to Base - 1  |       for i = 0 to Base - 1  | ||
| − |          for k = 0 to buckets[i].length  | + |          for k = 0 to buckets[i].length - 1  | 
            добавляем  buckets[i][k] в конец массива answer  |             добавляем  buckets[i][k] в конец массива answer  | ||
      return answer  |       return answer  | ||
| Строка 33: | Строка 33: | ||
Приведенный код работает не только для строк, а для любых объектов для которых можно определить порядок, систему счисления и функцию partition.  | Приведенный код работает не только для строк, а для любых объектов для которых можно определить порядок, систему счисления и функцию partition.  | ||
==Асимптотика==  | ==Асимптотика==  | ||
| − | Пусть <tex>n</tex>   | + | Пусть <tex>n</tex> - количество элементов в массиве, <tex>k</tex> - основание системы исчисления и    | 
| − | <tex>p</tex>   | + | <tex>p</tex> - количество разрядов в объекте.  | 
| − | Тогда алгоритм "Bucket sort" в процессе работы сделает не более чем <Tex>O(p   | + | Тогда алгоритм "Bucket sort" в процессе работы сделает не более чем <Tex>O (p \cdot (n + k))</Tex> итераций.  | 
| − | Заметим ,что в случае случайного распределения мат. ожидания количество элементов в каждом блоке <tex> n/k</tex>. Следовательно, в средним алгоритм "карманной сортировки" совершает <Tex>O(n \cdot log_k n)</Tex> действий. При этом на некотором множестве наборов, где <tex> k = O(n)</tex>, алгоритм отработает за линейное время.  | + | Заметим, что в случае случайного распределения мат. ожидания количество элементов в каждом блоке <tex> n/k</tex>. Следовательно, в средним алгоритм "карманной сортировки" совершает <Tex>O (n \cdot log_k n)</Tex> действий. При этом на некотором множестве наборов, где <tex> k = O(n)</tex>, алгоритм отработает за линейное время.  | 
| − | В худшем случае сортировка работает за <tex>O(n^2)</tex>.  | + | В худшем случае сортировка работает за <tex>O (n^2)</tex>.  | 
==Примечания==  | ==Примечания==  | ||
Сортировка быстро работает для равновероятного распределения значений разрядов объектов в заданной для них системе счисления.  | Сортировка быстро работает для равновероятного распределения значений разрядов объектов в заданной для них системе счисления.  | ||
Версия 19:51, 10 июня 2012
Карманная сортировка (Bucket sort) — алгоритм сортировки , основанный на предположении о равномерном распределении входных данных.
Содержание
Алгоритм сортировки
Принцип работы
- элементы массива входных данных разбиваются на блоков ("карманов","корзин").
 - каждый из блоков сортируется либо другой сортировкой, либо рекурсивно тем же методом разбиения.
 - из каждого отсортированного блока данные записываются в массив в порядке разбиения на блоки.
 
Важно отметить, что разбиение на блоки производится таким образом, чтобы элементы каждого следующего блока были бы больше предыдущего.
Реализация
Рассмотрим код работы алгоритма, где — длина каждой строки. <wikitex>
Bucketsort (A, j){ // A - массив данных, j - текущий разряд
    if (A.length < 2 || j == p + 1)
        return A;
    buckets <- инициализируем массив длины Base, где каждая ячейка — список входных объектов (в нашем случае    
    строк).
    for i = 0  to A.length - 1  
      добавляем A[i] в конец массива buckets[partition (A[i], j)] 
    // partition — функция которая по данному объекту и индексу возвращает число от 0 до Base - 1
    // в случае со строками функция partition возвращает код 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.
Приведенный код работает не только для строк, а для любых объектов для которых можно определить порядок, систему счисления и функцию partition.
Асимптотика
Пусть - количество элементов в массиве, - основание системы исчисления и - количество разрядов в объекте. Тогда алгоритм "Bucket sort" в процессе работы сделает не более чем итераций. Заметим, что в случае случайного распределения мат. ожидания количество элементов в каждом блоке . Следовательно, в средним алгоритм "карманной сортировки" совершает действий. При этом на некотором множестве наборов, где , алгоритм отработает за линейное время. В худшем случае сортировка работает за .
Примечания
Сортировка быстро работает для равновероятного распределения значений разрядов объектов в заданной для них системе счисления. Быстрая сортировка является частным случаем "карманной" сортировки, в случае разбиения всех элементов на "кармана". Также стоит отметить, что по принципу своей работы Bucket sort схожа с Цифровой сортировкой.