Кіріспе

Сорталау алгоритмі

Компьютерлік ғылымда, таңдау арқылы сұрыптау – деректерді орнында салыстыру арқылы сұрыптау алгоритмі. Оның уақыт күрделілігі O(n²), бұл оны үлкен тізімдерде тиімсіз етеді және көбінесе ұқсас енгізу арқылы сұрыптаудан нашар жұмыс істейді. Таңдау арқылы сұрыптау қарапайымдығымен ерекшеленеді және кейбір жағдайларда, әсіресе қосымша жад шектеулі болғанда, күрделі алгоритмдерге қарағанда артықшылықтарға ие. Алгоритм кіріс тізімін екі бөлікке бөледі: тізімнің басында (сол жақта) солдан оңға қарай құрылатын сұрыпталған кіші тізім және тізімнің қалған бөлігін құрайтын сұрыпталмаған элементтердің кіші тізімі. Бастапқыда сұрыпталған кіші тізім бос болады, ал сұрыпталмаған кіші тізім – кіріс тізімінің толық бөлігі. Алгоритм сұрыпталмаған кіші тізімдегі ең кіші (немесе ең үлкен, сұрыптау ретіне байланысты) элементті тауып, оны сұрыпталмаған бөліктің сол жақ шетіндегі элементпен алмастырып (орнымен ауыстырып), кіші тізімнің шекарасын бір элементке оңға жылжытады. Таңдау арқылы сұрыптаудың уақыт тиімділігі квадраттық, сондықтан таңдау арқылы сұрыптаудан жақсы уақыт күрделілігіне ие бірнеше сұрыптау техникалары бар.

Басқа сұрыптау алгоритмдермен салыстыру

Квадраттық сұрыптау алгоритмдерінің арасында (орташа жағдайда Θ(n2) күрделігі бар сұрыптау алгоритмдері), таңдау сұрыптау көбінесе көпіршік сұрыптау және гном сұрыптау алгоритмдерінен жақсы нәтижелер көрсетеді. Қыстыру сұрыптау да өте ұқсас, себебі kth итерациядан кейін массивтегі алғашқы k элементі сұрыпталған болады. Қыстыру сұрыптаудың артықшылығы – st элементін орналастыру үшін қажетті элементтерді ғана қарау, ал таңдау сұрыптау st элементін табу үшін массивтегі қалған барлық элементтерді қарауы керек. Қарапайым есептеулер көрсеткендей, қыстыру сұрыптау таңдау сұрыптауға қарағанда шамамен екі есе аз салыстыру операциясын жасайды, бірақ бұл көрсеткіш массивдің бастапқы ретіне байланысты өзгеруі мүмкін. Кейбір нақты уақыт қолданулары үшін таңдау сұрыптаудың масситтің ретіне қарамастан, әрқашан бірдей жұмыс істеуі артықшылық болып есептелуі мүмкін, ал қыстыру сұрыптаудың орындалу уақыты айтарлықтай өзгеріп отыруы мүмкін. Дегенмен, бұл көбінесе қыстыру сұрыптау үшін артықшылық болып табылады, өйткені массив қазірдің өзінде сұрыпталған немесе "сұрыпталғанға жақын" болса, ол әлдеқайда тиімді жұмыс істейді. Жазулар саны бойынша таңдау сұрыптау қыстыру сұрыптаудан артықшылыққа ие (алмасуларға қарсы, әр алмасу екі жазу операциясынан тұрады), бұл циклдық сұрыптаумен қол жеткізілетін теориялық минимумнан екі есеге жуық, ол ең көп дегенде n жазу операциясын жасайды. Егер жазу операциялары оқу операцияларынан әлдеқайда қымбат болса (мысалы, EEPROM немесе Flash жадында, әр жазу жадтың қызмет ету мерзімін қысқартады), бұл маңызды болуы мүмкін. Таңдау сұрыптау CPU тармақтау болжаушыларының жұмысын жақсарту үшін, тармақталмайтын кодты қолданып ең төменгі элементті табу және содан кейін алмасуды шартсыз түрде орындау арқылы болжауға қиындық тудырмайтын етіп жүзеге асырылуы мүмкін. Соңында, үлкен массивтерде таңдау сұрыптау біріктіру сұрыптау сияқты "бөліп жеңу" алгоритмдерімен салыстырғанда нашар жұмыс істейді. Алайда, қыстыру сұрыптау немесе таңдау сұрыптау әдетте кіші массивтер үшін (яғни 10–20 элементтен аз) жылдам болады. Практикада рекурсивті алгоритмдер үшін пайдалы оңтайландыру – "жеткілікті кішкентай" кіші тізімдер үшін қыстыру сұрыптау немесе таңдау сұрыптауға ауысу.