Сортування комірками

Матеріал з testwiki
Перейти до навігації Перейти до пошуку

Шаблон:Картка алгоритм Сортування комірками або коміркове сортування[1] (Шаблон:Lang-en) — це стабільний алгоритм впорядкування, що доцільно використовувати, якщо вхідні дані розподілені рівномірно. В основі алгоритму лежить розподілення всіх елементів по скінченній кількості комірок. Кожна комірка впорядковується окремо іншим алгоритмом впорядкування або ж рекурсивно алгоритмом впорядкування комірками. Сортування комірками є узагальненням сортування підрахунком.

Алгоритм працює за час O(N), оскільки використовує додаткову інформацію про елементи.

Псевдокод алгоритму

Тоді як сортування підрахунком припускає, що входові дані складються з цілих чисел із маленького діапазону, сортування комірками припускає, що входові дані утворені випадковим процесом, що розподіляє елементи рівномірно і незалежно в проміжку [0,1). Процедура Bucket_Sort(A) виконує впорядкування масиву A

Bucket_Sort(A)
1 nlength[A]  
2 for i1 to n
3         do Вставити елемент A[i] в список B[nA[i]]
4 for i0 to n1
5         do Впорядкувати список B[i]
6 Об'єднати списки B[0],B[1],...,B[n1]

Аналіз складності алгоритму

Виконання всіх елементів алгоритму, крім рядка 5, очевидно вимагає O(n) часу. Залишається підрахувати повний час, що знадобиться на n викликів алгоритму сортування у рядку 5. Будемо вважати, що використовується алгоритм сортування вставкою.

Час роботи сортування комірками буде: T(n)=Θ(n)+i=0n1O(ni2), де ni — кількість елементів масиву, що потрапили в i-у комірку.

Обчислимо математичне очікування: M[T(n)]=M[Θ(n)+i=0n1O(ni2)]=

=Θ(n)+M[i=0n1O(ni2)]=Θ(n)+i=0n1O(M[ni2])

Так як всі комірки рівноправні, то M[ni2]=F(n),i

Справедливим є запис:

ni=j=1nχij,χij={1,A[i]B[j]0

Тобто, ni представляється сумою незалежних однаково розподілених випадкових величин. Тоді:

M[ni2]=M[(j=1nχij)2]=M[j=1nk=1nχijχik]=M[j=1nχij2+j=1n1kn,kjnχijχik]=

=j=1nM[χij2]+j=1n1kn,kjnM[χijχik]=j=1n1n+j=1n1kn,kjnM[χij]M[χik]=

=1+n(n1)1n2=1+n1n=21n

Підставивши результат у вираз для T(n) маємо:

M[T(n)]=Θ(n)+i=0n1O(21n)=Θ(n)+O(n)=Θ(n)

Отже, очікуваний час роботи алгоритму лінійно залежить від розміру вхідного масиву.

Зауваження: середній час роботи буде лінійним навіть у випадку нерівномірного розподілу елементів масиву. Для лінійного часу необхідно лише, щоб сума квадратів кількостей елементів в кожній комірці лінійно залежала від загальної кількості елементів.

Примітки

Шаблон:Reflist

Шаблон:Алгоритми сортування