Тъй като всички алгоритми за сортиране при сравнение отнемат поне n lg n време, защо изобщо ще трябва да използваме нещо като бързо сортиране, когато можем да изразим елементите в списъка за бързо сортиране като битове и използвайки нещо като радикално сортиране, което е линейно?
Ако съществуват алгоритми за линейно сортиране по време като Radix Sort, кога трябва да използваме сортиране за сравнение?
Отговори (2)
Radix сортирането има тенденция да показва лоша локалност на кеша, вижте например този документ за анализ на различни алгоритми за сортиране под влиянието на кеша (преминете към заключението за обсъждане на лошото местоположение на кеша на радикалното сортиране в сравнение с бързото сортиране и сортирането чрез сливане). Quicksort и mergesort разделят данните така, че след няколко итерации дялът ще се побере на няколко реда на кеша, докато радикалното сортиране продължава да разбърква данните. В допълнение, радикалното сортиране или трябва да използва свързани структури от данни за своите кофи (които показват лоша производителност на кеша), или в противен случай трябва да използва прекалено големи масиви (които губят памет).
Също така, в зависимост от размера на радикса на сортирането по принцип, неговият постоянен коефициент може да бъде по-голям от коефициента на журнал на бързото сортиране/сливането. В краен случай, използвайки радикс от 2 на 64-битови цели числа, радикалното сортиране има постоянен коефициент 64 (едно преминаване на бит), докато е много малко вероятно коефициентът на дневника на бързото сортиране / сливането да е толкова голям (тъй като това би означавало, че вие сортирате 2^64 елемента)
Съвременните реализации на mergesort, използващи SIMD ядро за сортиране на кратки масиви, могат да бъдат много, много бързи. Тази статия от някои хора от Intel описва едно такова изпълнение. Основното предимство тук е, че SIMD ядрото може да прави няколко сравнения и суапове на тактов цикъл, като получава и се възползва от няколко бита информация за масива, който трябва да се сортира за тактов цикъл.
Бързото сортиране изисква тест, магазин и увеличение на един от два указателя при всяка итерация, което образува една единствена огромна верига на зависимости. Това не е страхотно, тъй като означава, че получавате един бит информация за масива на всеки няколко такта.
Radix сортирането има същия проблем като Quicksort (всяко преминаване е една огромна верига на зависимост с достъп и увеличение на един указател от голям, равномерно разпределен набор). Въпреки това, при равномерно разпределени входове, правилно внедрено MSD радикално сортиране, използващо пет- или шест-битови ключове, може да направи с едно преминаване през входа това, за което Quicksort ще отнеме пет или шест преминавания. Не съм измервал времето на тези неща наскоро, но доброто сортиране по радикс на MSD все още може да бъде най-добрият начин за сортиране на големи масиви от int
s или long long
s.
Нищо от тези неща за радикалното сортиране няма да ви топли през нощта, ако вашият вход е зле разпределен и вселената от възможни ключове е голяма в сравнение с броя на ключовете във вашия вход.
foo1 < foo2
прави някаква сложна логика. - person AndyG   schedule 01.10.2014