Сортування Діріхле — це алгоритм сортування, який підходить для сортування списків елементів, де кількість елементів (n) і довжина діапазону можливих значень ключів (N) приблизно однакові. Це вимагає O(n+N) часу. Він подібний до сортування підрахунком, але відрізняється тим, що він переміщує елементи двічі: один раз в масив відрахувань, а в другий раз до кінцевого масиву, оскільки сортування підрахунком створює допоміжний масив для обчислення кінцевого місця кожного елемента і його переміщення.
Клас | Алгоритм сортування |
---|---|
Структура даних | Масив |
Найгірша швидкодія | , де N — діапазон значень, n довжина вхідного масиву |
Просторова складність у найгіршому випадку |
Алгоритм працює таким чином:
- Враховуючи масив значень, що підлягають сортуванню, створюється допоміжний масив спочатку порожніх значень, один прохід для кожного ключа через діапазон вихідного масиву.
- Переходячи до початкового масиву, кожне значення кладеться в комірку, що відповідає його ключу, таким чином, щоб кожна комірка згодом містила список всіх значень з цим ключем.
- Послідовно переставляється матриця з наведених елементів, і елементи кладуться з непустого вузла назад у вихідний масив.
Приклад
Відсортуємо ці пари значень за першим елементом:
- (5, «привіт»)
- (3, «пиріг»)
- (8, «яблуко»)
- (5, «король»)
Для кожного значення між 3 і 8 ми встановлюємо комірку, а потім переміщуємо кожен елемент у його комірку:
- 3: (3, «пиріг»)
- 4:
- 5: (5, «привіт»), (5, «король»)
- 6:
- 7:
- 8: (8, «яблуко»)
Потім матриця повторюється, а елементи повертаються до початкового списку.
Різниця між сортуванням Діріхле і сортуванням підрахунком полягає в тому, що в сортуванні підрахунку допоміжний масив не містить списків вхідних елементів, тільки підраховує:
- 3: 1
- 4: 0
- 5: 2
- 6: 0
- 7: 0
- 8: 1
Використовуючи цю інформацію, можна було б виконати серію обмінів на вхідному масиві, які б поклали його в порядок, переміщаючи елементи тільки один раз.
Для масивів, де N значно перевищує n, сортування комірками є узагальненням, яке є більш ефективним у просторі та часі.
Реалізації Python та Golang
def pigeonhole_sort(a): mi = min(a) size = max(a) - mi + 1 holes = [0] * size for x in a: holes[x - mi] += 1 i = 0 for count in xrange(size): while holes[count] > 0: holes[count] -= 1 a[i] = count + mi i += 1
type Pair struct { Key int Value string } type KeyValueArray []Pair func (a KeyValueArray) MinKey() int { if len(a) <= 0{ return 0 } min := a[0].Key for _, v := range a { if min > v.Key { min = v.Key } } return min } func (a KeyValueArray) MaxKey() int { if len(a) <= 0{ return 0 } max := a[0].Key for _, v := range a { if max < v.Key { max = v.Key } } return max } func (a KeyValueArray) pigeonHoleSort() []int{ mi := a.MinKey() size := a.MaxKey() - mi + 1 aux := make([]int, len(a)) holes := make([]int, size) for _, pair := range a { holes[pair.Key - mi] += 1 } i := 0 for count := 0; count < size; count++ { for holes[count] > 0 { holes[count] -= 1 aux[i] = count + mi i += 1 } } return aux } func main() { arr := []Pair{ {5, "hello"}, {3, "pie"}, {8, "apple"}, {5, "king"}, } kvArr := KeyValueArray(arr) fmt.Println(kvArr.pigeonHoleSort()) }
Див. також
Список літератури
- NIST's Dictionary of Algorithms and Data Structures: pigeonhole sort
- Black, Paul E. Dictionary of Algorithms and Data Structures. NIST. Процитовано 6 листопада 2015.
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Sortuvannya Dirihle ce algoritm sortuvannya yakij pidhodit dlya sortuvannya spiskiv elementiv de kilkist elementiv n i dovzhina diapazonu mozhlivih znachen klyuchiv N priblizno odnakovi 1 Ce vimagaye O n N chasu Vin podibnij do sortuvannya pidrahunkom ale vidriznyayetsya tim sho vin peremishuye elementi dvichi odin raz v masiv vidrahuvan a v drugij raz do kincevogo masivu oskilki sortuvannya pidrahunkom stvoryuye dopomizhnij masiv dlya obchislennya kincevogo miscya kozhnogo elementa i jogo peremishennya 2 Sortuvannya DirihleKlasAlgoritm sortuvannyaStruktura danihMasivNajgirsha shvidkodiyaO N n displaystyle O N n de N diapazon znachen n dovzhina vhidnogo masivuProstorova skladnist u najgirshomu vipadkuO N n displaystyle O N n Algoritm pracyuye takim chinom Vrahovuyuchi masiv znachen sho pidlyagayut sortuvannyu stvoryuyetsya dopomizhnij masiv spochatku porozhnih znachen odin prohid dlya kozhnogo klyucha cherez diapazon vihidnogo masivu Perehodyachi do pochatkovogo masivu kozhne znachennya kladetsya v komirku sho vidpovidaye jogo klyuchu takim chinom shob kozhna komirka zgodom mistila spisok vsih znachen z cim klyuchem Poslidovno perestavlyayetsya matricya z navedenih elementiv i elementi kladutsya z nepustogo vuzla nazad u vihidnij masiv Zmist 1 Priklad 2 Realizaciyi Python ta Golang 3 Div takozh 4 Spisok literaturiPrikladred Vidsortuyemo ci pari znachen za pershim elementom 5 privit 3 pirig 8 yabluko 5 korol Dlya kozhnogo znachennya mizh 3 i 8 mi vstanovlyuyemo komirku a potim peremishuyemo kozhen element u jogo komirku 3 3 pirig 4 5 5 privit 5 korol 6 7 8 8 yabluko Potim matricya povtoryuyetsya a elementi povertayutsya do pochatkovogo spisku Riznicya mizh sortuvannyam Dirihle i sortuvannyam pidrahunkom polyagaye v tomu sho v sortuvanni pidrahunku dopomizhnij masiv ne mistit spiskiv vhidnih elementiv tilki pidrahovuye 3 1 4 0 5 2 6 0 7 0 8 1 Vikoristovuyuchi cyu informaciyu mozhna bulo b vikonati seriyu obminiv na vhidnomu masivi yaki b poklali jogo v poryadok peremishayuchi elementi tilki odin raz Dlya masiviv de N znachno perevishuye n sortuvannya komirkami ye uzagalnennyam yake ye bilsh efektivnim u prostori ta chasi Realizaciyi Python ta Golangred Pythondef pigeonhole sort a mi min a size max a mi 1 holes 0 size for x in a holes x mi 1 i 0 for count in xrange size while holes count gt 0 holes count 1 a i count mi i 1 Golang type Pair struct Key int Value string type KeyValueArray Pair func a KeyValueArray MinKey int if len a lt 0 return 0 min a 0 Key for v range a if min gt v Key min v Key return min func a KeyValueArray MaxKey int if len a lt 0 return 0 max a 0 Key for v range a if max lt v Key max v Key return max func a KeyValueArray pigeonHoleSort int mi a MinKey size a MaxKey mi 1 aux make int len a holes make int size for pair range a holes pair Key mi 1 i 0 for count 0 count lt size count for holes count gt 0 holes count 1 aux i count mi i 1 return aux func main arr Pair 5 hello 3 pie 8 apple 5 king kvArr KeyValueArray arr fmt Println kvArr pigeonHoleSort Div takozhred Princip Dirihle Sortuvannya za rozryadamiSpisok literaturired NIST s Dictionary of Algorithms and Data Structures pigeonhole sort Black Paul E Dictionary of Algorithms and Data Structures NIST Procitovano 6 listopada 2015 Otrimano z https uk wikipedia org w index php title Sortuvannya Dirihle amp oldid 42906495