Кіріспе

Элементтер жұбын салыстыру арқылы жұмыс істейтін сұрыптау алгоритмінің түрі. Салыстыру сұрыптау – бұл тек бір абстрактілік салыстыру операциясы (көбінесе "кем немесе тең" операторы немесе үш жолды салыстыру) арқылы тізім элементтерін оқитын сұрыптау алгоритмінің түрі, ол соңғы сұрыпталған тізімде екі элементтің қайсысының бірінші болуы керектігін анықтайды. Жалғыз талап – оператордың деректер бойынша толық алдын ала реттілік құруы: егер a ≤ b және b ≤ c болса, онда a ≤ c (транзитивтілік); барлық a және b үшін, a ≤ b немесе b ≤ a (байланыстылық). a ≤ b және b ≤ a болуы мүмкін; бұл жағдайда сұрыпталған тізімде бірінші орынға кез келгені шығуы мүмкін. Тұрақты сұрыптауда кіріс реті осы жағдайда сұрыпталған ретті анықтайды. Әдебиетте зерттелетін салыстыру түрлері "салыстыруға негізделген". a және b элементтерін алмастыру немесе басқаша қайта орналастыру алгоритмімен тек осы элементтердің арасындағы реті алдыңғы салыстырулардың нәтижесі негізінде белгіленген кезде ғана жүзеге асырылады. Бұл a және b арасындағы реттілікті осы алдыңғы салыстыру нәтижелерінің транзитивті жабылуы арқылы алуға болатын жағдайда. Салыстыруға негізделген сұрыптаулар үшін салыстырудан басқа негізгі операцияларды орындау шешімі салыстырулардың нәтижесіне негізделеді. Сондықтан уақыт талдау кезінде орындалған салыстырулардың саны алмастыру немесе тағайындау сияқты орындалған негізгі операциялардың санының жоғарғы шегін анықтау үшін қолданылады, бұл сызықтық-логарифмдік уақыт деп аталады. Бұл тек салыстыру арқылы ғана қол жетімді шектеулі ақпараттың салдарынан, немесе басқаша айтқанда, толық реттелген жиынтықтардың тұйық алгебралық құрылымынан туындайды. Осы мағынада, біріктіру, үймелеу және интросортировка олар орындауы тиіс салыстырулардың саны жағынан асимптотикалық түрде оптималды, дегенмен бұл метрика басқа операцияларды ескермейді. Салыстыруға жатпайтын сұрыптаулар (мысалы, төменде қарастырылған мысалдар) салыстырудан басқа операцияларды қолдану арқылы O(n) өнімділікке қол жеткізе алады, бұл төменгі шекті айналып өтуге мүмкіндік береді (элементтердің мөлшері тұрақты деп есептесек). Салыстыру сұрыптаулары кейбір тізімдерде жылдам жұмыс істеуі мүмкін; көптеген бейімделуші сұрыптаулар, мысалы, енгізу сұрыптаулары, қазірдің өзінде сұрыпталған немесе жақында сұрыпталған тізімде O(n) уақытында жұмыс істейді. Ω(n log n) төменгі шек тек кіріс тізімі кез келген мүмкін ретпен болуы мүмкін жағдайда қолданылады. Нақты әлемдегі сұрыптау жылдамдығын өлшеу кейбір алгоритмдердің салыстырмалы түрде жылдам кэштелген компьютер жадын оңтайлы пайдалану қабілетін ескеруі қажет, немесе қолданба сұрыпталған деректер пайдаланушыға тез пайда бола бастайтын сұрыптау әдістерінен пайда болуы мүмкін (содан кейін пайдаланушының оқу жылдамдығы шектейтін фактор болады), бұл бүкіл тізім сұрыпталғанға дейін ешқандай нәтиже бермейтін сұрыптау әдістеріне қарсы. Осы шектеулерге қарамастан, салыстыру сұрыптаулары салыстыру функциясын басқару көптеген әртүрлі деректер түрлерін сұрыптауға және тізімді қалай сұрыптауды жақсы бақылауға мүмкіндік беретін маңызды практикалық артықшылықты ұсынады. Мысалы, салыстыру функциясының нәтижесін кері қайтару тізімді кері реттеп алуға мүмкіндік береді; ал түпкілік тәртіппен тізімді сұрыптау үшін әр бөлігін ретпен салыстыратын салыстыру функциясын жасауға болады:
function tupleCompare((lefta, leftb, leftc), (righta, rightb, rightc)) {
if (lefta ≠ righta)
return compare(lefta, righta);
else if (leftb ≠ rightb)
return compare(leftb, rightb);
else
return compare(leftc, rightc);
}

Салыстыру сұрыптаулары күрделі реттерге, мысалы, қалқыма нүктелі сандардың ретіне оңай бейімделеді. Сонымен қатар, салыстыру функциясы жазылғаннан кейін кез келген салыстыру сұрыптауын өзгертусіз қолдануға болады; салыстыру емес сұрыптаулар әдетте әрбір дерек түрі үшін арнайы нұсқаларды қажет етеді. Бұл икемділік, жоғарыда аталған салыстыру сұрыптау алгоритмдерінің тиімділігімен бірге, қазіргі заманғы компьютерлерде салыстыру сұрыптауларын көптеген практикалық жұмыстарда кеңінен таңдауға әкелді.

Баламалар

Кейбір сұрыптау мәселелері салыстыру арқылы сұрыптау үшін Ω(n log n) шегінен қатаң жылдам шешімге ие, оны салыстырусыз сұрыптау арқылы қолдануға болады; мысалы, бүтін сандарды сұрыптау, онда барлық кілттер бүтін сандар болып табылады. Кілттердің диапазоны n-мен салыстырғанда шағын болғанда, санау сұрыптау сызықтық уақытта жұмыс істейтін алгоритмнің мысалы болып табылады. Радикстік сұрыптау сияқты басқа бүтін сандарды сұрыптау алгоритмдері салыстыру арқылы сұрыптаудан асимптотикалық тұрғыдан жылдам болмаса да, практикада жылдам болуы мүмкін. Сандар жұбын олардың қосындысы бойынша сұрыптау мәселесі де Ω(n² log n) шегіне бағынбауға болады (жұптастырудан туындаған квадрат); ең жақсы белгілі алгоритм әлі де O(n² log n) уақыт алады, бірақ тек O(n²) салыстыруды қажет етеді.