Сортування підрахунком (англ. Counting sort) — алгоритм впорядкування, що застосовується при малій кількості різних елементів (ключів) у масиві даних. Час його роботи лінійно залежить як від загальної кількості елементів у масиві так і від кількості різних елементів.
Ідея алгоритму
Ідея алгоритму полягає в наступному: спочатку підрахувати скільки разів кожен елемент (ключ) зустрічається в вихідному масиві. Спираючись на ці дані можна одразу вирахувати на якому місці має стояти кожен елемент, а потім за один прохід поставити всі елементи на свої місця.
Псевдокод алгоритму
Для простоти будемо вважати, що всі елементи (ключі) є натуральними числами що лежать в діапазоні Процедура виконує сортування масиву :
1 — масив з K елементів, заповнений нулями 2 for to 3 do 4 // Зараз містить кількість елементів, що дорівнюють 5 for to 6 do 7 // Зараз містить кількість елементів менших або рівних 8 for downto 9 do 10 11
Аналіз алгоритму
В алгоритмі присутні тільки прості цикли: в рядках 2, 6, 9 — цикл довжини N (довжина масиву), в рядку 4 — цикл довжини K (величина діапазону). Отже, складність роботи алгоритму є .
В алгоритмі використовуються два додаткових масиви: і . Тому алгоритм потребує додаткової пам'яті.
В такій реалізації алгоритм є стабільним. Саме ця його властивість дозволяє використовувати його як частину інших алгоритмів сортування (напр. сортування за розрядами).
Використання даного алгоритму є доцільним тільки у випадку малих K (порядку N).
Приклад реалізації на С++
#include <vector> #include <algorithm> using namespace std; void counting_sort(vector<int>& elems, int min, int max) { if (elems.empty() || min > max) { return; } vector<unsigned> counts(max - min + 1); for (int elem: elems) { ++counts[elem - min]; } auto elemsIt = elems.begin(); //current position to write result for (int i = min; i <= max; ++i) { // write counts[i - min] copies of i into elems fill_n(elemsIt, counts[i - min], i); elemsIt += counts[i - min]; } }
Примітки
- Т. Кормен; Ч. Лейзерсон; Р. Рівест; К. Стайн (2009) [1990]. Розділ 8.2: Сортування підрахунком. Вступ до алгоритмів (вид. 3rd). MIT Press і McGraw-Hill. ISBN .
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Sortuvannya pidrahunkom angl Counting sort algoritm vporyadkuvannya sho zastosovuyetsya pri malij kilkosti riznih elementiv klyuchiv u masivi danih Chas jogo roboti linijno zalezhit yak vid zagalnoyi kilkosti elementiv u masivi tak i vid kilkosti riznih elementiv Ideya algoritmuIdeya algoritmu polyagaye v nastupnomu spochatku pidrahuvati skilki raziv kozhen element klyuch zustrichayetsya v vihidnomu masivi Spirayuchis na ci dani mozhna odrazu virahuvati na yakomu misci maye stoyati kozhen element a potim za odin prohid postaviti vsi elementi na svoyi miscya Psevdokod algoritmuDlya prostoti budemo vvazhati sho vsi elementi klyuchi ye naturalnimi chislami sho lezhat v diapazoni 1 K displaystyle 1 K Procedura Counting Sort A displaystyle Counting Sort A vikonuye sortuvannya masivu A displaystyle A Counting Sort A displaystyle Counting Sort A 1 C displaystyle C masiv z K elementiv zapovnenij nulyami 2 for i 1 displaystyle i gets 1 to length A displaystyle length A 3 do C A i C A i 1 displaystyle C A i gets C A i 1 4 Zaraz C i displaystyle C i mistit kilkist elementiv sho dorivnyuyut i displaystyle i 5 for i 2 displaystyle i gets 2 to K displaystyle K 6 do C i C i C i 1 displaystyle C i gets C i C i 1 7 Zaraz C i displaystyle C i mistit kilkist elementiv menshih abo rivnih i displaystyle i 8 for i length A displaystyle i gets length A downto 1 displaystyle 1 9 do B C A i A i displaystyle B C A i gets A i 10 C A i C A i 1 displaystyle C A i gets C A i 1 11 A B displaystyle A gets B Analiz algoritmuV algoritmi prisutni tilki prosti cikli v ryadkah 2 6 9 cikl dovzhini N dovzhina masivu v ryadku 4 cikl dovzhini K velichina diapazonu Otzhe skladnist roboti algoritmu ye O N K displaystyle O N K V algoritmi vikoristovuyutsya dva dodatkovih masivi C displaystyle C i B displaystyle B Tomu algoritm potrebuye O N K displaystyle O N K dodatkovoyi pam yati V takij realizaciyi algoritm ye stabilnim Same cya jogo vlastivist dozvolyaye vikoristovuvati jogo yak chastinu inshih algoritmiv sortuvannya napr sortuvannya za rozryadami Vikoristannya danogo algoritmu ye docilnim tilki u vipadku malih K poryadku N Priklad realizaciyi na S include lt vector gt include lt algorithm gt using namespace std void counting sort vector lt int gt amp elems int min int max if elems empty min gt max return vector lt unsigned gt counts max min 1 for int elem elems counts elem min auto elemsIt elems begin current position to write result for int i min i lt max i write counts i min copies of i into elems fill n elemsIt counts i min i elemsIt counts i min PrimitkiT Kormen Ch Lejzerson R Rivest K Stajn 2009 1990 Rozdil 8 2 Sortuvannya pidrahunkom Vstup do algoritmiv vid 3rd MIT Press i McGraw Hill ISBN 0 262 03384 4