Saralash algoritmlari: pufakcha, birlashtirish, tezkor va boshqalar
Asoslar3 daqInnovialabs tahririyati
Qisqacha
Oddiy saralashlar (pufakcha, qo‘yish) O(n²) da ishlaydi va kichik massivlarga mos, birlashtirish, tezkor va piramida saralash esa O(n log n); real kodda deyarli har doim tilning o‘rnatilgan sort funksiyasi eng yaxshi tanlov.
Qisqa javob
Saralash — elementlarni kalit bo‘yicha tartiblash. Algoritmlar uchta xususiyat bilan farqlanadi:
- Vaqt murakkabligi — elementlar soni n oshganda ishlash vaqti qanday o‘sadi.
- Xotira — qo‘shimcha massiv kerakmi yoki hammasi joyida (in-place) bajariladimi.
- Barqarorlik (stability) — teng elementlar dastlabki tartibini saqlaydimi.
O‘rganish uchun har bir algoritmni tushunish foydali. Ishda esa deyarli har doim tilingizdagi o‘rnatilgan sort yetarli.
Pufakcha saralash (bubble sort)
Massiv bo‘ylab yurib, noto‘g‘ri turgan qo‘shni elementlarni almashtiramiz. Har bir o‘tishdan keyin eng katta element oxiriga «suzib chiqadi».
a[0]vaa[1]ni solishtirish, kerak bo‘lsa almashtirish.a[1]vaa[2]ni solishtirish va shunday oxirigacha.- Bitta ham almashtirish bo‘lmagan o‘tishgacha takrorlash.
Murakkablik — O(n²), barqaror. Amalda deyarli ishlatilmaydi: bu o‘quv misoli.
Qo‘yish orqali saralash (insertion sort)
Elementlarni birma-bir olib, allaqachon saralangan chap qismdagi to‘g‘ri joyga qo‘yamiz — qo‘ldagi kartalarni tartiblagandek.
def insertion_sort(a):
for i in range(1, len(a)):
key = a[i]
j = i - 1
while j >= 0 and a[j] > key:
a[j + 1] = a[j]
j -= 1
a[j + 1] = key
return a
Eng yomon holatda O(n²), lekin deyarli saralangan ma’lumotlarda O(n) ga yaqin. Barqaror va joyida ishlaydi. Shu sababli gibrid algoritmlar ichida kichik bo‘laklar uchun qo‘llaniladi.
Tanlash orqali saralash (selection sort)
Har qadamda saralanmagan qismdagi minimumni topib, boshiga qo‘yamiz. Har doim O(n²) solishtirish, lekin almashtirishlar kam. Odatiy ko‘rinishida barqaror emas.
Birlashtirish orqali saralash (merge sort)
«Bo‘l va hukmronlik qil» tamoyili:
- Massivni ikkiga bo‘lamiz.
- Har bir yarmini rekursiv saralaymiz.
- Ikki saralangan yarmini birinchi elementlarini solishtirib birlashtiramiz.
Har doim O(n log n), barqaror. Kamchiligi — qo‘shimcha O(n) xotira kerak. Bog‘langan ro‘yxatlar va xotiraga sig‘maydigan katta fayllarni tashqi saralash uchun qulay.
Tezkor saralash (quicksort)
- Tayanch element (pivot) tanlanadi.
- Elementlar qayta joylanadi: kichiklari chapga, kattalari o‘ngga.
- Ikkala qism rekursiv saralanadi.
O‘rtacha O(n log n) va xotira bilan samarali ishlagani uchun amalda juda tez. Eng yomon holat — O(n²), agar pivot doim chetki qiymat bo‘lib chiqsa (masalan, saralangan massivda birinchi element tanlanganda). Tasodifiy pivot yoki uchtasining medianasi bu muammoni hal qiladi. Barqaror emas.
Piramida saralash (heapsort)
Massivdan ikkilik uyum (heap) quriladi, keyin maksimum qayta-qayta olinadi. Kafolatlangan O(n log n), joyida ishlaydi, lekin barqaror emas va amalda odatda quicksort’dan sekinroq.
Taqqoslash
| Algoritm | O‘rtacha | Eng yomon | Qo‘shimcha xotira | Barqaror |
|---|---|---|---|---|
| Pufakcha | O(n²) | O(n²) | O(1) | Ha |
| Qo‘yish | O(n²) | O(n²) | O(1) | Ha |
| Tanlash | O(n²) | O(n²) | O(1) | Yo‘q |
| Birlashtirish | O(n log n) | O(n log n) | O(n) | Ha |
| Tezkor | O(n log n) | O(n²) | O(log n) | Yo‘q |
| Piramida | O(n log n) | O(n log n) | O(1) | Yo‘q |
O‘rnatilgan saralashlar nimadan foydalanadi
Standart kutubxonalar gibrid algoritmlarni qo‘llaydi:
- Timsort — birlashtirish va qo‘yish saralashi, allaqachon tartiblangan qismlarni topa oladi. Python’da va Java’da obyektlarni saralashda ishlatiladi. Barqaror.
- Introsort — quicksort sifatida boshlanadi, rekursiya juda chuqurlashsa heapsort’ga o‘tadi, kichik bo‘laklarni qo‘yish orqali tugatadi. C++ dagi
std::sortuchun xos. - JavaScript’da spetsifikatsiya
Array.prototype.sortbarqaror bo‘lishini talab qiladi; dvigatellar odatda Timsort ishlatadi.
Ko‘p uchraydigan xatolar
- Production uchun o‘z saralashingizni yozish — o‘rnatilgani deyarli har doim tezroq va sinovdan o‘tgan.
- Bir nechta maydon bo‘yicha saralashda barqarorlikni unutish.
- Noto‘g‘ri komparator: JavaScript’da
[10, 9, 1].sort()elementlarni satr sifatida solishtiradi.sort((a, b) => a - b)kerak.