Кіріспе

Сорталау алгоритмі – салыстыру арқылы бір-бірлеп элемент қосып, соңғы реттелген массивті (немесе тізімді) құратын қарапайым сұрыптау алгоритмі. Үлкен тізімдерде ол жылдам сұрыптау, үймелі сұрыптау немесе біріктіру сұрыптау сияқты жетілдірілген алгоритмдерге қарағанда әлдеқайда тиімсіз. Дегенмен, енгізу сұрыптау бірнеше артықшылықтар ұсынады:

Оңай іске асыру: Джон Бентли C/C++ тіліндегі үш жолдық нұсқасын көрсеткен, ол оңтайландырылғанда бес жолға дейін жетеді.

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

Сақтау сұрыптау таңдау сұрыптауға өте ұқсас. Таңдау сұрыптаудағыдай, массив бойынша k рет өтілгеннен кейін алғашқы k элемент сұрыпталған болады. Дегенмен, екі алгоритмнің басты айырмашылығы – сақтау сұрыптау ағымдағы кілттен артқа қарай іздейді, ал таңдау сұрыптау алға қарай іздейді. Бұл таңдау сұрыптауда алғашқы k элементтің сұрыпталмаған кірістің k ең кіші элементі ретінде анықтаса, сақтау сұрыптауда олар кірістің алғашқы k элементі болып табылады. Сақтау сұрыптаудың таңдау сұрыптаудан басты артықшылығы – таңдау сұрыптау тізімнің сұрыпталмаған бөлігіндегі ең кіші элементті табу үшін қалған барлық элементтерді міндетті түрде қарап шығаруы керек, ал сақтау сұрыптау (k+1)-ші элемент k-шы элементтен үлкен болған жағдайда тек бір салыстыруды қажет етеді. Бұл жиі орын алғанда (мысалы, кіріс массиві қазірдің өзінде сұрыпталған немесе жартылай сұрыпталған болса), сақтау сұрыптау таңдау сұрыптауға қарағанда айқын тиімдірек болады. Орташа есепте (k+1)-ші элементтің орны кездейсоқ деп есептегенде), сақтау сұрыптау алдыңғы k элементтің жартысын салыстырып, жылдыруды қажет етеді, яғни сақтау сұрыптау орташа есеппен таңдау сұрыптауға қарағанда шамамен жартысына жуық салыстыру жасайды. Сақтау сұрыптаудың ең нашар жағдайында (кіріс массиві кері сұрыпталғанда) сақтау сұрыптау таңдау сұрыптаумен бірдей мөлшерде салыстыру жасайды. Алайда, сақтау сұрыптаудың таңдау сұрыптауға қарағанда кемшілігі – әр итерацияда (k+1)-ші элементті массивтің сұрыпталған бөлігіне енгізу үшін көптеген элементтерді жылдыру қажет болғандықтан, көбірек жазу операцияларын қажет етеді, ал таңдау сұрыптаудың әр итерациясы үшін тек бір жылдыру жеткілікті. Жалпы, сақтау сұрыптау массивке O(n²) рет жазады, ал таңдау сұрыптау тек O(n) рет жазады. Осы себепті, EEPROM немесе флэш-жад сияқты жадқа жазу оқудан әлдеқайда қымбат болған жағдайларда таңдау сұрыптау артық болуы мүмкін. Жылдам сұрыптау және біріктіру сұрыптау сияқты кейбір «бөліп билеу» алгоритмдері үлкен массивтер үшін сақтау сұрыптаудан артық болса, сақтау сұрыптау немесе таңдау сұрыптау сияқты рекурсивті емес сұрыптау алгоритмдері әдетте өте кішкентай массивтер үшін (нақты мөлшері ортаға және іске асыруға байланысты, бірақ әдетте 7 мен 50 элемент арасында) жылдам болады. Сондықтан, осы алгоритмдерді іске асыруда пайдалы оңтайландыру – гибридтік тәсіл, массив кіші өлшемге бөлінген кезде қарапайым алгоритмді пайдалану. Егер салыстырудың құны жылдырудан жоғары болса (мысалы, сілтеме арқылы сақталған мәтіндік кілттер немесе адамның өзара әрекеттесуі, мысалы, қатар көрсетілген екі элементтен біреуін таңдау), онда екілік сақтау сұрыптауын пайдалану жақсы нәтиже беруі мүмкін. Екілік сақтау сұрыптау жаңа элементтерді енгізу үшін дұрыс орынды анықтау үшін екілік іздеуді қолданады, сондықтан ең нашар жағдайда log₂n салыстыру жасайды. Массивтегі әрбір элемент ізделіп, енгізілгенде бұл O(n log n) болады. Әрбір енгізу үшін бір-бірінен жылдыруды болдырмау үшін кіріс элементтерді байланысты тізімде сақтауға болады, бұл тізімге элементтерді орны белгілі болғанда тұрақты уақытта қосуға немесе одан шығаруға мүмкіндік береді. Алайда, байланысты тізімде іздеу үшін қажетті орынға сілтемелерді бірізді түрде орындау қажет: байланысты тізімде кездейсоқ қол жетімділік жоқ, сондықтан ол екілік іздеу сияқты жылдам әдісті қолдана алмайды. Сондықтан іздеу үшін қажетті уақыт O(n), ал сұрыптау уақыты O(n²) болады. Егер күрделірек дерек құрылымы (мысалы, үйінді немесе екілік ағаш) қолданылса, іздеу мен енгізу үшін қажетті уақыт айтарлықтай қысқаруы мүмкін; бұл үйінді сұрыптаудың және екілік ағаш сұрыптаудың мәні. 2006 жылы Бендер, Мартин Фарач Колтон және Мостеиро кітапхана сұрыптау немесе аралықты сақтау деп аталатын жаңа сұрыптау түрін жариялады, ол массивке таралған аз мөлшерде пайдаланылмаған кеңістік қалдырады. Пайдасы – енгізулер тек аралыққа жеткенше элементтерді жылдырып отыруды қажет етеді. Авторлар бұл сұрыптау алгоритмі жоғары ықтималдылықпен O(n log n) уақытында жұмыс істейтінін көрсетеді. Егер өткізіп тастау тізімі қолданылса, енгізу уақыты O(log n) дейін төмендейді, ал жылдырулар қажет емес, өйткені өткізіп тастау тізімі байланысты тізім құрылымында іске асырылады. Сақтаудың соңғы жұмыс уақыты O(n log n) болады.