Кіріспе

Бөліп-бөліп шешу алгоритмі

Quicksort – тиімді, жалпы мақсаттағы сұрыптау алгоритмі. Quicksort әдісін 1959 жылы британдық компьютер ғалымы Тони Хоэр әзірлеген және 1961 жылы жариялаған. Ол әлі күнге дейін сұрыптау үшін кеңінен қолданылатын алгоритм болып табылады. Жалпы алғанда, ол кездейсоқ деректер үшін, әсіресе үлкен жиынтарда, біріктіру сұрыптаудан және үймелеу сұрыптаудан сәл жылдам. Quicksort – бұл бөліп-бөліп шешу алгоритмі. Ол массивтен 'тіреу' элементін таңдап, қалған элементтерді тіреутен үлкен немесе кішкентай болуына қарай екі кіші массивке бөлу арқылы жұмыс істейді. Осы себепті ол кейде бөлу және алмастыру сұрыптау деп аталады. Содан кейін кіші массивтер рекурсивті түрде сұрыпталады. Бұл орынды пайдаланып жасауға болады, сұрыптауды орындау үшін аз ғана қосымша жад қажет. Quicksort – салыстыруға негізделген сұрыптау, яғни ол "кішкентай" қатынасы (формалды түрде, толық реттелу) анықталған кез келген типтегі элементтерді сұрыптай алады. Бұл салыстыру негізіндегі сұрыптау, себебі a және b элементтері тек олардың салыстырмалы реті бұрынғы салыстыру нәтижелерінің транзитивті жабылуында анықталған жағдайда ғана алмастырылады. Quicksort-тың көптеген іске асырылымдары тұрақты емес, яғни бірдей сұрыптау элементтерінің салыстырмалы реті сақталмайды. Quicksort-тың математикалық талдауы көрсеткендей, орташа есеп бойынша алгоритм n элементті сұрыптау үшін салыстыруды қажет етеді. Ең нашар жағдайда, ол салыстыру жасайды.

Тарих

Тез сұрыптау алгоритмін 1959 жылы Тони Хоарь Мәскеу мемлекеттік университетінде студент ретінде оқып жүргенде жасады. Сол кезде Хоарь Ұлттық физикалық зертханада машиналық аударма жобасымен айналысып жүрді. Аударма процесінің бір бөлігі ретінде, ол сөздерді орыс тіліндегі сөйлемдерде сұрыптап, содан кейін магниттік таспада сақталған орысша-ағылшынша сөздікте іздеуі керек болды. Оның алғашқы идеясы – енгізу сұрыптау, өте баяу боларын түсінген соң, ол жаңа идеяға келді. Ол бөлу бөлігін Mercury Autocode-та жазды, бірақ сұрыпталмаған сегменттер тізімін басқаруда қиындықтар туды. Англияға оралғаннан кейін, одан Shellsort үшін код жазуды сұрады. Хоарь өзінің бастығына одан жылдам алгоритмді білетінін айтты, ал бастығы оның білмейтініне алты пенс тігіс қойды. Ақырында бастығы тігісті ұтылғанын мойындады. Хоарь өзінің алгоритмі туралы мақаласын The Computer Journal журналының 5-томы, 1-саны, 1962 жылғы 10-16 беттерінде жариялады. Кейін Хоарь ALGOL және оның рекурсия жасау мүмкіндігі туралы білді, бұл оған алгоритмнің жақсартылған нұсқасын сол кездегі ең беделді компьютерлік ғылым журналы – Computing Machinery Association Communications-те ALGOL тілінде жариялауға мүмкіндік берді. ALGOL коды ACM (CACM) журналының 4-томы, 7-шы айы, 1961 жылғы 321-бетте, 63-алгоритм: бөлу және 64-алгоритм: тез сұрыптау ретінде жарияланды. Quicksort кеңінен қолданысқа енді, мысалы, Unix жүйесінде әдепкі кітапхананың сұрыптау ішкі бағдарламасы ретінде пайда болды. Сондықтан ол C стандартты кітапханасының ішкі бағдарламасына, сондай-ақ салыстырулар мен алмасулардың күтілетін санын есептеуге де өз атын берді. Бентли сол эссесінде Quicksort-ты "мен жазған ең әдемі код" деп сипаттады. Ломутоның бөлу схемасы "Алгоритмдерге кіріспе" оқулығында танымал болды, бірақ ол Хоарьдің схемасына қарағанда нашар, себебі ол орташа есеппен үш есе көп алмасу жасайды және барлық элементтер тең болған жағдайда O(n^2) уақытында жұмыс істейді. 1998 жылы Макилрой AntiQuicksort функциясын жасады, ол тіпті 1993 жылғы Quicksort-тың да квадратық мінез-құлыққа түсуіне себеп болды, өйткені ол қарсыластық деректерді дереу жасады.

Алгоритм

Quicksort - массивті сұрыптау үшін бөлу және басқару алгоритмінің бір түрі, ол бөлу процедурасына негізделген; осы бөлудің егжей-тегжейі шамалы өзгеруі мүмкін, сондықтан quicksort - бұл шын мәнінде тығыз байланысты алгоритмдер отбасы. Кем дегенде екі элементтен тұратын диапазонға қолданғанда, бөлу екі тікелей, бос емес қосалқы диапазонға бөлінеді, осылайша бірінші қосалқы диапазонның ешбір элементі екінші қосалқы диапазонның кез келген элементінен үлкен болмайды. Осы бөліністен кейін quicksort қосалқы диапазонды рекурсивті түрде сұрыптайды, мүмкін, бөліну нүктесіндегі элементті алып тастағаннан кейін, ол осы сәтте өз соңғы орнында екені белгілі. Рекурсивті табиғатына байланысты quicksort (бөлу процедурасы сияқты) үлкен массивтің ішіндегі диапазон үшін шақырылатындай етіп құрастырылуы керек, тіпті соңғы мақсат толық массивті сұрыптау болса да. Орнында quicksort үшін қадамдар: Егер диапазонның ішінде екі элементтен кем болса, дереу қайта оралыңыз, өйткені ештеңе жасаудың қажеті жоқ. Мүмкін, өте қысқа ұзындықтар үшін арнайы сұрыптау әдісі қолданылады және осы қадамдардың қалғаны жіберіліп қойылады. Әйтпесе, диапазонның ішінде кездесетін півот деп аталатын мәнді таңдаңыз (нақты таңдау әдісі бөлу процедурасына байланысты және кездейсоқтықты қамтуы мүмкін). Диапазонды бөліңіз: элементтерін қайта реттеңіз, сонымен бірге бөліну нүктесін анықтаңыз, осылайша півоттан кіші мәндері бар барлық элементтер бөлінуден бұрын, ал півоттан үлкен мәндері бар барлық элементтер одан кейін орналасады; півотқа тең элементтер екі жаққа да орналаса алады. Півоттың кем дегенде бір мысалы болғандықтан, көптеген бөлу процедуралары бөліну нүктесіндегі мән півотқа тең болады және қазірдің өзінде соңғы орнында болады деп қамтамасыз етеді (бірақ quicksort аяқталуы осыған байланысты емес, егер бастапқыдан кішкентай қосалқы диапазон туындаса). Бөліну нүктесіне дейінгі және одан кейінгі қосалқы диапазонға quicksort-ты рекурсивті түрде қолданыңыз, мүмкін, екі диапазоннан да бөліну нүктесіндегі півотқа тең элементті алып тастаңыз. (Егер бөлу шекараға жақын үлкен қосалқы диапазонды тудырса, онда барлық элементтер півотқа тең деп танылса, оларды да алып тастауға болады.) Бөлу процедурасын таңдау (оның ішінде півотты таңдау) және жоғарыда толық көрсетілмеген басқа да егжей-тегжейлер алгоритмнің өнімділігіне әсер етуі мүмкін, тіпті белгілі бір кіріс массивтері үшін айтарлықтай. Quicksort-тың тиімділігін талқылау кезінде осы таңдауларды бірінші кезекте нақтылау қажет. Мұнда екі нақты бөлу әдісін атап өтейік.

Параллельдеу

Quicksort-тың бөліп-жеңу қағидасы тапсырмалық параллелизмді пайдалану арқылы оны параллельдеуге қолайлы етеді. Бөлу кезеңі параллель префикс суммасы алгоритмін қолдану арқылы жүзеге асырылады, бұл әрбір массив элементі үшін бөлінген массивінің бөліміндегі индексті есептейді. n өлшемді массив үшін бөлу кезеңі O(n) жұмысты O(log n) уақытында орындайды және O(n) қосымша уақытша жадты қажет етеді. Массив бөлінгеннен кейін екі бөлімді параллель рекурсивті түрде сұрыптауға болады. Півоттардың ең жақсы таңдалуын болғанда, параллель quicksort n өлшемді масситті O(n log n) жұмысты O(log² n) уақытында, O(n) қосымша жадты пайдалана отырып сұрыптайды. Quicksort-тың тиімді параллельдеуін қиындататын, merge sort сияқты балама сұрыптау алгоритмдерімен салыстырғанда кейбір кемшіліктері бар. Quicksort-тың бөліп-жеңу ағашының тереңдігі алгоритмнің кеңейтілуіне тікелей әсер етеді, ал бұл тереңдік алгоритмнің півот таңдауына өте байланысты. Сонымен қатар, бөлу кезеңін тиімді түрде параллельдеу қиын. Уақытша жадты пайдалану бөлу кезеңін жеңілдетеді, бірақ алгоритмнің жад көлемін және тұрақты қосымша шығындарды арттырады. Басқа, күрделі параллель сұрыптау алгоритмдері одан да жақсы уақыт шектеріне қол жеткізе алады. Мысалы, 1991 жылы Дэвид М.В. Пауэрс n процессорлы CRCW (concurrent read and concurrent write) PRAM (параллельді кездейсоқ қолжетімділік машинасы) жүйесінде O(log n) уақытында жұмыс істей алатын параллель quicksort-ты (және оған байланысты radix sort-ты) сипаттады, бұл бөлуді жасырын түрде жүзеге асыру арқылы мүмкін болды.

Ең нашар жағдайды талдау

Ең теңгерімсіз бөлу, бөлшектеу процедурасы қайтаратын кіші тізімдердің бірі n-1 өлшемде болғанда пайда болады. Бұл півот тізімдегі ең кішкентай немесе ең үлкен элемент болғанда, немесе кейбір іске асыруларда (мысалы, жоғарыда сипатталған Lomuto бөлу схемасы) барлық элементтер тең болғанда болуы мүмкін. Егер мұндай жағдай әр бөлу кезінде қайталап орын алса, әр рекурсивті шақыру алдыңғы тізімнен бір элемент кем тізімді өңдейді. Осының салдарынан, 1 өлшемді тізімге жеткенше n-1 деңгейлі шақырулар жасалады. Бұл шақыру ағашы n-1 деңгейлі шақырулардың тізбектік тізбегі екенін білдіреді. I-ші шақыру бөлуді орындау үшін O(n-i) жұмыс атқарады, сондықтан бұл жағдайда жылдам сұрыптау O(n²) уақыт алады.

Ең жақсы жағдайды талдау

Ең теңдестірілген жағдайда, әр бөліс жасағанда тізімді шамамен тең екі бөлікке бөлеміз. Яғни, әрбір рекурсивті шақыру бастапқы тізімнің жартысына дейін қысқартылған тізімді өңдейді. Осылайша, 1 өлшемді тізімге жету үшін біз log2 n рекурсивті шақыру жасай аламыз. Бұл шақыру ағашының тереңдігі log2 n екенін білдіреді. Алайда, шақыру ағашының бір деңгейіндегі екі шақыру бастапқы тізімнің бірдей бөлігін өңдемейді; сондықтан, шақырулардың әрбір деңгейіне барлығы O(n) уақыт жұмсалады (әрбір шақырудың тұрақты шығындары бар, бірақ әр деңгейде тек O(n) шақыру болғандықтан, бұл O(n) факторына сіңіріледі). Соның салдарынан, алгоритм O(n log n) уақытты ғана пайдаланады.

Орташа жағдайды талдау

N түрлі элементтердің массивін сұрыптау үшін жылдам сұрыптау, барлық n! элементтің тең ықтималдығымен болатын пермутациялары бойынша орташа есептегенде O(n log n) уақыт алады. Балама ретінде, егер алгоритм кіріс массивінен півотты біркелкі кездейсоқ түрде таңдаса, кез келген кіріс тізбегі үшін күтілетін жұмыс уақытын шектеу үшін дәл сол талдау қолданылуы мүмкін; күту содан кейін алгоритм жасаған кездейсоқ таңдаулар бойынша есептеледі (Cormen et al., Алгоритмдерге кіріспе).

Жылдам сұрыптау, орнында және тұрақсыз бөлуді пайдаланатын болса, кез келген рекурсивті шақыру жасамас бұрын тек тұрақты қосымша кеңістік ғана қолданады. Жылдам сұрыптау әрбір ішкі рекурсивті шақыру үшін тұрақты көлемде ақпарат сақтауы керек. Ең жақсы жағдайда ең көп дегенде O(log n) ішкі рекурсивті шақыру жасалатындықтан, ол O(log n) кеңістік қолданады. Дегенмен, рекурсивті шақыруларды шектеу үшін Седжвиктің әдісі қолданылмаса, ең жаман жағдайда жылдам сұрыптау O(n) ішкі рекурсивті шақыру жасауы мүмкін және O(n) көмекші кеңістік қажет болады. Биттік күрделілік тұрғысынан алғанда, lo және hi сияқты айнымалылар тұрақты кеңістік қолданбастайды; n элементтен тұратын тізімге индекстеу үшін O(log n) бит қажет. Әрбір стек кадрында мұндай айнымалылар болғандықтан, Седжвиктің әдісін қолданатын жылдам сұрыптау O((log n)^2) бит кеңістік қажет етеді. Бұл кеңістік талабы тым үлкен емес, себебі тізімде ерекше элементтер болса, оған кем дегенде O(n log n) бит кеңістік қажет болар еді. Басқа, сирек қолданылатын, орнында емес жылдам сұрыптау нұсқасы жұмыс сақтау үшін O(n) кеңістік қолданады және тұрақты сұрыптауды іске асыруы мүмкін. Жұмыс сақтау кіріс массивін тұрақты түрде оңай бөлуге және содан кейін рекурсивті шақырулар үшін кіріс массивіне көшіруге мүмкіндік береді. Седжвиктің оптимизациясы әлі де тиімді.

Басқа алгоритмдермен байланысы

Quicksort – бинарлық ағаш сұрыптауының жадты үнемдеуге бағытталған нұсқасы. Анық ағашқа элементтерді тізбектей енгізудің орнына, quicksort оларды рекурсивті шақырулар арқылы көрінетін ағашта бірден ұйымдастырады. Алгоритмдер дәл сол салыстыруларды жасайды, бірақ басқа ретпен. Сорттау алгоритмінің маңызды қасиеттерінің бірі – тұрақтылық, яғни салыстыру нәтижесі тең элементтердің реті өзгереді, бұл көп кілтті кестелердің (мысалы, каталогтар немесе папкалар тізімі) реттілігін табиғи түрде басқаруға мүмкіндік береді. Орындалатын quicksort үшін бұл қасиетті сақтау қиын (ол тек тұрақты қосымша жадыны сілтемелер мен буферлер үшін және O(log n) қосымша жадыны ашық немесе жасырын рекурсияны басқару үшін пайдаланады). Көрнекілеуге (мысалы, тізімдер немесе ағаштар) немесе файлдарға (фактылық түрде тізімдер) байланысты қосымша жадыны қажет ететін quicksort нұсқалары үшін тұрақтылықты сақтау оңай. Құрылымдар неғұрлым күрделі немесе дискіге байланысты болса, уақыт шығындары артады, әдетте виртуалды жад немесе дискіні көбірек пайдаланады. Quicksort-тың тікелей бәсекелесі – heapsort. Heapsort қарапайымдылығымен және ең жаман жағдайда O(n log n) орындалу уақытымен артықшылықтарға ие, бірақ heapsort-тың орташа орындалу уақыты әдетте орындалатын quicksort-тан баяу деп есептеледі, негізінен нашар сілтемелік жеріне байланысты. Бұл нәтиже күмәнді; кейбір жарияланымдар керісін көрсетеді. Quicksort-тың басты кемшілігі – жаман півот таңдауларынан және оның салдарынан аулақ болу үшін қажетті күрделі іске асыру. Introsort – quicksort-тың нұсқасы, ол жаман жағдай анықталғанда heapsort-қа ауысу арқылы бұл мәселені шешеді. Басты бағдарламалау тілдері, мысалы C++ (GNU және LLVM нұсқаларында), introsort-ты пайдаланады. 1999 жылғы процессор кэшін тиімді пайдалану үшін баптаудан өткен, півоттардың өзгермелі саны бар multiquicksort бағалауы нұсқаулар санын шамамен 20%-ға арттырды, бірақ симуляция нәтижелері өте үлкен кірістерде тиімдірек болатынын көрсетті. 2009 жылы Ярославский жасаған екі півотты quicksort нұсқасы Java 7-де примитивтер массивін сұрыптаудың стандартты алгоритмі ретінде іске асыруға жеткілікті жылдам болды (объекттер массивін сұрыптау Timsort арқылы жүзеге асырылады). Бұл алгоритмнің өнімділік артықшылығы көбінесе кэш өнімділігімен байланысты екені анықталды, ал тәжірибелік нәтижелер үш півотты нұсқаның қазіргі заманғы машиналарда одан да жақсы жұмыс істеуі мүмкін екенін көрсетеді.

Сыртқы жылдам сұрыптау

Дискілік файлдар үшін, жылдам сұрыптауға ұқсас бөлуге негізделген сыртқы сұрыптау мүмкін. Бұл сыртқы біріктіру сұрыптаудан баяу, бірақ қосымша дискілік кеңістік қажет етпейді. 4 буфер қолданылады, 2 кіріс үшін, 2 шығыс үшін. N – файлдағы жазбалардың саны, B – буфердегі жазбалардың саны және M = N/B – файлдағы буфер сегменттерінің саны болсын. Деректер файлдың екі шетінен де ішке қарай оқылады (жазылады). X – файлдың басында басталатын сегменттерді, ал Y – файлдың соңында басталатын сегменттерді білдірсін. Деректер X және Y оқу буферлеріне оқылады. Бір півоттық жазба таңдалады және X және Y буферлеріндегі півоттық жазбадан басқа жазбалар півоттық жазбамен салыстырылып, X жазу буферіне өсу ретімен, ал Y жазу буферіне кему ретімен көшіріледі. X немесе Y буфері толтырылғаннан кейін, ол файлға жазылады және келесі X немесе Y буфері файлдан оқылады. Процесс барлық сегменттер оқылып, бір жазу буфері қалғанға дейін жалғасады. Егер бұл буфер X жазу буфері болса, півоттық жазба оған қосылады және X буфері жазылады. Егер бұл буфер Y жазу буфері болса, півоттық жазба Y буферіне қосылады және Y буфері жазылады. Бұл файлды бөлудің бір қадамы болып табылады, және файл енді екі кіші файлдан тұрады. Әрбір кіші файлдың бастапқы және соңғы орналасуы жеке стекке немесе рекурсия арқылы негізгі стекке түртіледі/алынып тасталады. Стекке арналған орынды O(log2(n)) дейін шектеу үшін, кіші кіші файл алдымен өңделеді. Жеке стек үшін, үлкен кіші файлдың параметрлерін стекке түртіңіз, содан кейін кіші кіші файл бойынша итерация жасаңыз. Рекурсия үшін, алдымен кіші кіші файл бойынша рекурсия жасаңыз, содан кейін үлкен кіші файлды өңдеу үшін итерация жасаңыз. Кіші файл 4B жазбадан кем немесе тең болғаннан кейін, кіші файл жылдам сұрыптау арқылы орнында сұрыпталады және жазылады. Бұл кіші файл енді сұрыпталған және файлда орналасқан. Процесс барлық кіші файлдар сұрыпталғанша және орнында тұрғанша жалғасады. Файлдағы өтулердің орташа саны шамамен 1 + ln(N+1)/(4B) құрайды, бірақ ең нашар жағдайдағы үлгі N өту (ішкі сұрыптау үшін O(n^2) тең).

Үш жолды радикс жылдам сұрыптау

Бұл алгоритм радикстік сұрыптау мен жылдам сұрыптаудың комбинациясы болып табылады. Массивтен элементті (пивотты) таңдап, жолдың бірінші таңбасын (кілт) қарастырыңыз (көп кілтті). Қалған элементтерді үш жиынға бөліңіз: сәйкес таңбасы пивоттың таңбасынан кішкентай, тең және үлкен элементтер. "Кішкентай" және "үлкен" жиындарды бір таңба бойынша рекурсивті түрде сұрыптаңыз. "Тең" жиынды келесі таңба (кілт) бойынша рекурсивті түрде сұрыптаңыз. Егер біз байттарды немесе W битті сөздер арқылы сұрыптасақ, ең жақсы жағдай O(KN) және ең нашар жағдай O(2^KN) немесе кем дегенде O(N^2) болады, стандартты жылдам сұрыптау сияқты, бірегей кілттер үшін N<2^K болғанда, ал K – барлық стандартты салыстыру сұрыптау алгоритмдеріндегі, оның ішінде жылдам сұрыптаудағы жасырын тұрақты шама. Бұл үш жолды жылдам сұрыптаудың бір түрі, онда ортаңғы жиын пивотқа дәл тең элементтердің (тривиальды) сұрыпталған кіші массивін көрсетеді.

Тез радикс сұрыптау

Сондай-ақ, Пауэрс бұл мәселені O(K) параллель PRAM алгоритмі ретінде әзірледі. Бұл, қайтадан, радикстік сұрыптау мен жылдам сұрыптаудың комбинациясы, бірақ жылдам сұрыптаудың солға/оңға бөлу шешімі кілттің тізбектелген биттері бойынша жасалады, сондықтан N K биттік кілттер үшін O(KN) болады. Барлық салыстыруға негіделген сұрыптау алгоритмдері K-ның Θ(log N) мәнімен трансдихотомиялық модельді түсіндіреді, өйткені K кішірек болса, хэш-кесте немесе бүтін сандық сұрыптауды қолдану арқылы O(N) уақытында сұрыптауға болады. Егер K ≫ log N болса, бірақ элементтер O(log N) биттерінің ішінде бірегей болса, қалған биттер жылдам сұрыптау немесе жылдам радикстік сұрыптау кезінде қарастырылмайды. Әйтпесе, барлық салыстыруға негіделген сұрыптау алгоритмдері де O(K) салыстырмалы түрде тиімсіз биттерді қарауға бірдей жүктеледі, бірақ жылдам радикстік сұрыптау стандартты жылдам сұрыптау мен радикстік жылдам сұрыптаудың ең нашар жағдайдағы O(N^(2)) мінез-құлқынан аулақ болады және осы uniqueprefix(K) ≫ log N шарттарында тіпті осы салыстыру алгоритмдерінің ең жақсы жағдайында да жылдам болады. Салыстыру, радикстік және параллель сұрыптаудың жасырын жүктемелері туралы толық ақпарат алу үшін Пауэрстің еңбектерін қараңыз.

BlockQuicksort (Блокты тез сұрыптау)

Кез келген салыстыруға негізделген сұрыптау алгоритмінде салыстыру санын азайту үшін әр салыстырудан алынатын ақпарат көлемін барынша арттыру қажет, яғни салыстыру нәтижелері болжамсыз болуы тиіс. Бұл жиі тармақтардың дұрыс болжалданбауына (branch mispredictions) әкеледі, бұл өнімділікті шектейді. BlockQuicksort жылдам сұрыптаудың есептеулерін қайта құрылымдап, болжамсыз тармақтарды деректерге тәуелділікке айналдырады. Бөлу кезінде кіріс орташа мөлшердегі блоктарға бөлінеді (олар деректер кэшіне оңай сыйып қана қоймай, тиімді пайдаланылады), және екі массив алмастырылатын элементтердің орналасуымен толтырылады. (Шартты тармақтарды болдырмау үшін, орналасу массивтің соңына шартсыз сақталады, ал алмастыру қажет болған жағдайда, соңғы индекс бірге өсіріледі.) Екінші кезеңде массивтерде көрсетілген орналасулардағы элементтер алмастырылады. Екі циклдың да тек бір шартты тармағы бар – тоқтау тесті, ол көбінесе орындалады. BlockQuicksort әдісі LLVM-нің C++ STL реализациясына, libcxx-ке енгізілді, бұл кездейсоқ бүтін сандар тізбегі үшін 50%-ға дейін өнімділікті арттырады. Үлгіні жеңіп шығатын жылдам сұрыптау (pdqsort), introsort-тың бір түрі, де осы техниканы қолданады.

Ішінара және қосымша жылдам сұрыптау

Көптеген жылдам сұрыптау нұсқалары бар, олар кірістің қалған бөлігінен ең кішкентай немесе ең үлкен k элементін бөліп шығарады.

Жалпылау

Ричард Коул мен Дэвид К. Кандатил 2004 жылы бір параметрлі реттеу алгоритмдерінің отбасын ашты, олар бөліс реттеулер деп аталды. Олардың орташа көрсеткіші (барлық кіріс тізбектерінің ықтималдығы бірдей болғанда) ең көп салыстыру (ақпараттық-теориялық ең төменгі шекке жуық) және операция жасайды; ең жаман жағдайда олар салыстыру (және операция) жасайды. Бұл алгоритмдер қосымша жадты қажет етпейтін, орнында жұмыс істейтін түрі. Оптимизацияланған жылдам реттеулермен (Sedgewick және Bentley McIlroy) салыстырғанда, олардың тиімділігі жоғары және өнімділік ауытқулары аз екені көрсетілді.