Сортування за розрядами (англ. Radix sort) — швидкий стабільний алгоритм впорядкування даних. Застосовується для впорядкування елементів, що є ланцюжками над будь-яким скінченним алфавітом (напр. рядки, або цілі числа). Як допоміжний використовує будь-який інший стабільний алгоритм сортування.
Клас | Алгоритм сортування |
---|---|
Структура даних | Масив |
Найгірша швидкодія | |
Просторова складність у найгіршому випадку |
Алгоритм застосовувався для впорядкування перфокарт.
Ефективність
Тема ефективності сортування за розрядами в порівнянні з іншими алгоритмами сортування дещо заплутана і є об'єктом багатьох непорозумінь. Те, чи сортування за розрядами більш, менш або так само ефективне як і найкращі алгоритми сортування порівняннями, залежить від того, які припущення зроблено. Часова складність сортування за розрядами O(wn) для n ключів, цілих розміром в машинне слово w. Іноді w представляють як сталу, що може зробити сортування за розрядами привабливішим (для достатньо великого n), ніж найкращі алгоритми сортування порівняннями, які виконуються за O(n log n) порівнянь, щоб відсортувати n ключів. Однак, у загальному випадку w не можна вважати сталою: якщо всі n ключів різні, тоді w має бути щонайменше log n для RAM-машини, щоб бути в стані зберігати їх в пам'яті, що дає найкращу швидкодію O(n log n). Тут може здатись, що сортування за розрядами не може бути ефективнішим, ніж найкращі алгоритми порівняння (навіть гірше, якщо ключі значно довші, ніж log n).
Контраргументом є те, що швидкодія сортування порівняннями вимірюються кількістю порівнянь, а не часом виконання. З деякими припущеннями порівняння в середньому вимагатимуть сталого часу, а з іншими припущеннями ні. Порівняння випадково згенерованих ключів потребує в середньому сталого часу, бо ключі відмінні в першому є біті у половині випадків і відмінні в другому біті у половині другої половини, і т.д. Що дає в середньому два біти, які треба порівняти. В сортувальних алгоритмах перші порівняння задовольняють умові випадковості, але з поступом алгоритму порівнювані ключі більше не випадково вибрані.
Ідея алгоритму
Ідея полягає в тому, щоб спочатку впорядкувати всі елементи за молодшим розрядом, потім стабільно впорядкувати за другим розрядом, потім за третім і так далі аж до найстаршого. Оскільки, припускається, що кожен розряд приймає значення з невеликого діапазону, то кожен цикл впорядкування можна виконувати швидко і з малими затратами пам'яті.
Приклад роботи
В прикладі показано, як впорядковувати таким алгоритмом масив трицифрових чисел:
572 572 523 266 266 523 349 349 783 --> 783 --> 266 --> 523 523 266 572 572 349 349 783 783 ^ ^ ^
Аналіз
Час роботи кожного циклу сортування залежить від того алгоритму, що використовується як допоміжний. Найчастіше використовують сортування підрахунком, що працює за час (де N — кількість елементів в масиві; K — кількість символів у алфавіті, якщо впорядковуються десяткові числа, то K = 10) і використовує додатково пам'яті. Всього здійснюється стільки циклів впорядкування, скільки розрядів у максимальному елементі.
Загальна складність роботи алгоритму з використанням сортування підрахунком є (D — кількість розрядів). Якщо впорядковувати цим алгоритмом цілі числа, то складність буде , де M — найбільший елемент масиву.
Приклад реалізації на C++
#include <iostream> #include <random> #include <limits> #include <vector> using namespace std; template<typename IntegerType> void radix_sort(vector<IntegerType>& elems, size_t max = numeric_limits<IntegerType>::max(), size_t base = 256) { vector< vector<IntegerType> > buckets(base); for (size_t b = 1; b < max; b *= base) { for( auto& bucket : buckets) { bucket.clear(); } for (auto cur : elems) { buckets[ (cur / b) % base].push_back(cur); } elems.clear(); for( auto& bucket : buckets) { elems.insert(elems.end(), bucket.begin(), bucket.end()); } } } //An example of usage int main() { vector<int> elems; //fill elems with random data random_device rd; mt19937 mt(rd()); uniform_real_distribution<double> dist(1, 100); for (size_t i = 0, size = 24; i < size; ++i) { elems.push_back(dist(mt)); } radix_sort(elems); for (auto x : elems) { cout << x << ' '; } return 0; }
Примітки
- Nilsson, Stefan (1 квітня 2000). The fastest sorting algorithm?. . 311: 38—45.
Посилання
- Чи швидше сортування за розрядами ніж швидке сортування на цілочисельних масивах? (англ.)
Джерела
- Thimas H. Cormen; Charles E. Leiserson; Ronald L. Rivest; Clifford Stein. Introduction to Algorithms (2nd ed.) The MIT Press.
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Sortuvannya za rozryadami angl Radix sort shvidkij stabilnij algoritm vporyadkuvannya danih Zastosovuyetsya dlya vporyadkuvannya elementiv sho ye lancyuzhkami nad bud yakim skinchennim alfavitom napr ryadki abo cili chisla Yak dopomizhnij vikoristovuye bud yakij inshij stabilnij algoritm sortuvannya Sortuvannya za rozryadamiKlasAlgoritm sortuvannyaStruktura danihMasivNajgirsha shvidkodiyaO k N displaystyle O kN Prostorova skladnist u najgirshomu vipadkuO k N displaystyle O k N Algoritm zastosovuvavsya dlya vporyadkuvannya perfokart EfektivnistTema efektivnosti sortuvannya za rozryadami v porivnyanni z inshimi algoritmami sortuvannya desho zaplutana i ye ob yektom bagatoh neporozumin Te chi sortuvannya za rozryadami bilsh mensh abo tak samo efektivne yak i najkrashi algoritmi sortuvannya porivnyannyami zalezhit vid togo yaki pripushennya zrobleno Chasova skladnist sortuvannya za rozryadami O wn dlya n klyuchiv cilih rozmirom v mashinne slovo w Inodi w predstavlyayut yak stalu sho mozhe zrobiti sortuvannya za rozryadami privablivishim dlya dostatno velikogo n nizh najkrashi algoritmi sortuvannya porivnyannyami yaki vikonuyutsya za O n log n porivnyan shob vidsortuvati n klyuchiv Odnak u zagalnomu vipadku w ne mozhna vvazhati staloyu yaksho vsi n klyuchiv rizni todi w maye buti shonajmenshe log n dlya RAM mashini shob buti v stani zberigati yih v pam yati sho daye najkrashu shvidkodiyu O n log n Tut mozhe zdatis sho sortuvannya za rozryadami ne mozhe buti efektivnishim nizh najkrashi algoritmi porivnyannya navit girshe yaksho klyuchi znachno dovshi nizh log n Kontrargumentom ye te sho shvidkodiya sortuvannya porivnyannyami vimiryuyutsya kilkistyu porivnyan a ne chasom vikonannya Z deyakimi pripushennyami porivnyannya v serednomu vimagatimut stalogo chasu a z inshimi pripushennyami ni Porivnyannya vipadkovo zgenerovanih klyuchiv potrebuye v serednomu stalogo chasu bo klyuchi vidminni v pershomu ye biti u polovini vipadkiv i vidminni v drugomu biti u polovini drugoyi polovini i t d Sho daye v serednomu dva biti yaki treba porivnyati V sortuvalnih algoritmah pershi porivnyannya zadovolnyayut umovi vipadkovosti ale z postupom algoritmu porivnyuvani klyuchi bilshe ne vipadkovo vibrani Ideya algoritmuIdeya polyagaye v tomu shob spochatku vporyadkuvati vsi elementi za molodshim rozryadom potim stabilno vporyadkuvati za drugim rozryadom potim za tretim i tak dali azh do najstarshogo Oskilki pripuskayetsya sho kozhen rozryad prijmaye znachennya z nevelikogo diapazonu to kozhen cikl vporyadkuvannya mozhna vikonuvati shvidko i z malimi zatratami pam yati Priklad robotiV prikladi pokazano yak vporyadkovuvati takim algoritmom masiv tricifrovih chisel 572 572 523 266 266 523 349 349 783 gt 783 gt 266 gt 523 523 266 572 572 349 349 783 783 AnalizChas roboti kozhnogo ciklu sortuvannya zalezhit vid togo algoritmu sho vikoristovuyetsya yak dopomizhnij Najchastishe vikoristovuyut sortuvannya pidrahunkom sho pracyuye za chas O N K displaystyle O N K de N kilkist elementiv v masivi K kilkist simvoliv u alfaviti yaksho vporyadkovuyutsya desyatkovi chisla to K 10 i vikoristovuye dodatkovo O N K displaystyle O N K pam yati Vsogo zdijsnyuyetsya stilki cikliv vporyadkuvannya skilki rozryadiv u maksimalnomu elementi Zagalna skladnist roboti algoritmu z vikoristannyam sortuvannya pidrahunkom ye O D N K displaystyle O D cdot N K D kilkist rozryadiv Yaksho vporyadkovuvati cim algoritmom cili chisla to skladnist bude O N log M displaystyle O N log M de M najbilshij element masivu Priklad realizaciyi na C include lt iostream gt include lt random gt include lt limits gt include lt vector gt using namespace std template lt typename IntegerType gt void radix sort vector lt IntegerType gt amp elems size t max numeric limits lt IntegerType gt max size t base 256 vector lt vector lt IntegerType gt gt buckets base for size t b 1 b lt max b base for auto amp bucket buckets bucket clear for auto cur elems buckets cur b base push back cur elems clear for auto amp bucket buckets elems insert elems end bucket begin bucket end An example of usage int main vector lt int gt elems fill elems with random data random device rd mt19937 mt rd uniform real distribution lt double gt dist 1 100 for size t i 0 size 24 i lt size i elems push back dist mt radix sort elems for auto x elems cout lt lt x lt lt return 0 PrimitkiNilsson Stefan 1 kvitnya 2000 The fastest sorting algorithm 311 38 45 PosilannyaChi shvidshe sortuvannya za rozryadami nizh shvidke sortuvannya na cilochiselnih masivah angl DzherelaThimas H Cormen Charles E Leiserson Ronald L Rivest Clifford Stein Introduction to Algorithms 2nd ed The MIT Press ISBN 0 07 013151 1