DSA Selection Sort (tanlab saralash)


ULASHISH

Selection Sort

Selection Sort algoritmi massivdagi eng kichik qiymatni topadi va uni massiv boshiga o‘tkazadi.

Tezlik:

{{ msgDone }}

Algoritm massivni qayta-qayta ko‘rib chiqib, navbatdagi eng kichik qiymatlarni oldinga o‘tkazadi va bu massiv saralanguncha davom etadi.

Qanday ishlaydi:

  1. Eng kichik qiymatni topish uchun massivni ko‘rib chiqing.
  2. Eng kichik qiymatni massivning saralanmagan qismi boshiga o‘tkazing.
  3. Massivni undagi qiymatlar soni qancha bo‘lsa, shuncha marta qayta ko‘rib chiqing.

Selection Sort algoritmini va uni o‘zingiz qanday amalga oshirishni to‘liq tushunish uchun o‘qishda davom eting.



Qo‘lda bajarib ko‘rish

Selection Sort algoritmini dasturlash tilida amalga oshirishdan oldin, g‘oyani tushunib olish uchun qisqa massiv bo‘ylab faqat bir marta qo‘lda o‘tib chiqaylik.

1-qadam: Saralanmagan massivdan boshlaymiz.

[ 7, 12, 9, 11, 3]

2-qadam: Massivni bittadan qiymat bo‘yicha ko‘rib chiqamiz. Qaysi qiymat eng kichik? 3, to‘g‘rimi?

[ 7, 12, 9, 11, 3]

3-qadam: Eng kichik qiymat — 3 ni massiv boshiga o‘tkazamiz.

[ 3, 7, 12, 9, 11]

4-qadam: 7 dan boshlab qolgan qiymatlarni ko‘rib chiqamiz. 7 eng kichik qiymat va u allaqachon massiv boshida turibdi, shuning uchun uni ko‘chirishimiz shart emas.

[ 3, 7, 12, 9, 11]

5-qadam: Massivning qolgan qismini ko‘rib chiqamiz: 12, 9 va 11. Eng kichik qiymat — 9.

[ 3, 7, 12, 9, 11]

6-qadam: 9 ni oldinga o‘tkazamiz.

[ 3, 7, 9, 12, 11]

7-qadam: 12 va 11 ni ko‘rib chiqamiz, ulardan eng kichigi — 11.

[ 3, 7, 9, 12, 11]

8-qadam: Uni oldinga o‘tkazamiz.

[ 3, 7, 9, 11, 12]

Nihoyat, massiv saralandi.


Yuqoridagi qadamlarni animatsiyada ko‘rish uchun quyidagi simulyatsiyani ishga tushiring:

{{ msgDone }}
[
{{ x.dieNmbr }},
]

Qo‘lda bajarib ko‘rish: nima sodir bo‘ldi?

Algoritmni to‘liq tushunishimiz va uni dasturlash tilida amalga oshira olishimiz uchun yuqorida nima sodir bo‘lganini tushunib olishimiz kerak.

Eng kichik qiymat — 3 ga nima bo‘lganini ko‘ryapsizmi? 3-qadamda u massiv boshiga, ya’ni o‘z joyiga o‘tkazildi, ammo o‘sha qadamda massivning qolgan qismi saralanmaganicha qoldi.

Shunday qilib, Selection Sort algoritmi massiv bo‘ylab qayta-qayta o‘tishi kerak va har safar navbatdagi eng kichik qiymat massivning saralanmagan qismi oldiga, ya’ni o‘zining to‘g‘ri o‘rniga o‘tkaziladi. Saralash eng katta qiymat — 12 massiv oxirida qolguncha davom etadi. Demak, 5 ta qiymatli massivni saralash uchun massiv bo‘ylab 4 marta o‘tishimiz kerak.

Algoritm massiv bo‘ylab har safar o‘tganda massivning qolgan saralanmagan qismi qisqarib boradi.

Endi o‘rganganlarimizdan foydalanib, Selection Sort algoritmini dasturlash tilida amalga oshiramiz.


Selection Sort’ni amalga oshirish

Selection Sort algoritmini dasturlash tilida amalga oshirish uchun bizga quyidagilar kerak:

  1. Saralanadigan qiymatlarga ega massiv.
  2. Massiv bo‘ylab o‘tadigan, eng kichik qiymatni topadigan va uni massiv boshiga o‘tkazadigan ichki sikl. Bu sikl har safar bajarilganda bitta kamroq qiymat bo‘ylab o‘tishi kerak.
  3. Ichki sikl necha marta bajarilishi kerakligini boshqaradigan tashqi sikl. \(n\) ta qiymatli massiv uchun bu tashqi sikl \(n-1\) marta bajarilishi kerak.

Natijaviy kod quyidagicha ko‘rinadi:

Misol

my_array = [64, 34, 25, 5, 22, 11, 90, 12]

n = len(my_array)
for i in range(n-1):
    min_index = i
    for j in range(i+1, n):
        if my_array[j] < my_array[min_index]:
            min_index = j
    min_value = my_array.pop(min_index)
    my_array.insert(i, min_value)

print("Sorted array:", my_array)
O‘zingiz sinab ko‘ring »

Selection Sort’dagi siljitish muammosi

Selection Sort algoritmini yana biroz takomillashtirish mumkin.

Yuqoridagi kodda eng kichik qiymatli element o‘chiriladi, so‘ngra massiv boshiga qo‘yiladi.

Har safar navbatdagi eng kichik qiymatli massiv elementi o‘chirilganda, o‘chirilgan element o‘rnini to‘ldirish uchun undan keyingi barcha elementlar bir pozitsiya pastga siljitilishi kerak.

Shifting other elements when an array element is removed.

Bu siljitish amallari ko‘p vaqt oladi, bu hali hammasi ham emas! Eng kichik qiymat (5) topilib o‘chirilgandan so‘ng, u massiv boshiga qo‘yiladi, bu esa quyidagi rasmda ko‘rsatilganidek, yangi qiymatga joy bo‘shatish uchun keyingi barcha qiymatlarning bir pozitsiya yuqoriga siljishiga sabab bo‘ladi.

Shifting other elements when an array element is inserted.

Eslatma: Agar Python yoki Java kabi yuqori darajali dasturlash tilidan foydalanayotgan bo‘lsangiz, bu siljitish amallari kodda qanday bajarilayotganini ko‘rmaysiz, ammo ular baribir fonda bajariladi. Bunday siljitish amallari kompyuterdan qo‘shimcha vaqt talab qiladi va bu muammo bo‘lishi mumkin.


Yechim: qiymatlarni almashtiring!

Barcha siljitishlar o‘rniga, quyida ko‘rsatilganidek, eng kichik qiymatni (5) birinchi qiymat (64) bilan almashtiring.

Shifting other elements when an array element is inserted.

Qiymatlarni yuqoridagi rasmda ko‘rsatilganidek almashtirishimiz mumkin, chunki eng kichik qiymat to‘g‘ri pozitsiyaga tushadi, u bilan almashtirilayotgan boshqa qiymatni qayerga qo‘yishimizning esa ahamiyati yo‘q, chunki u hali saralanmagan.

Quyida almashtirishdan foydalanadigan ushbu takomillashtirilgan Selection Sort qanday ishlashini ko‘rsatuvchi simulyatsiya keltirilgan:

Tezlik:

{{ msgDone }}

Quyida almashtirishdan foydalanadigan takomillashtirilgan Selection Sort’ning amalga oshirilishi keltirilgan:

Misol

my_array = [64, 34, 25, 12, 22, 11, 90, 5]

n = len(my_array)
for i in range(n):
    min_index = i
    for j in range(i+1, n):
        if my_array[j] < my_array[min_index]:
            min_index = j   
    my_array[i], my_array[min_index] = my_array[min_index], my_array[i]

print("Sorted array:", my_array)
O‘zingiz sinab ko‘ring »

Selection Sort’ning vaqt murakkabligi

Vaqt murakkabligi nima ekanligi haqida umumiy tushuntirish uchun ushbu sahifaga tashrif buyuring.

Selection Sort vaqt murakkabligi haqida yanada chuqurroq va batafsil tushuntirish uchun ushbu sahifaga tashrif buyuring.

Selection Sort \(n\) ta qiymatli massivni saralaydi.

O‘rtacha har bir siklda eng kichik qiymatni topish uchun taxminan \(\frac{n}{2}\) ta element taqqoslanadi.

Selection Sort esa eng kichik qiymatni topish siklini taxminan \(n\) marta bajarishi kerak.

Quyidagi vaqt murakkabligini olamiz:

\[ O( \frac{n}{2} \cdot n) = \underline{\underline{O(n^2)}} \]

Selection Sort algoritmining vaqt murakkabligini grafikda quyidagicha tasvirlash mumkin:

Selection Sort time complexity

Ko‘rib turganingizdek, bajarilish vaqti Bubble Sort’dagi bilan bir xil: massiv hajmi oshirilganda bajarilish vaqti juda tez ortadi.

Quyidagi simulyatsiyani turli o‘lchamdagi massivlar uchun ishga tushiring.

Qizil punktir chiziq nazariy vaqt murakkabligi \(O(n^2)\) ni ifodalaydi.

Simulyatsiyani ishga tushirganingizda ko‘k xochlar paydo bo‘ladi. Ko‘k xochlar ma’lum o‘lchamdagi massivni saralash uchun qancha amal kerakligini ko‘rsatadi.

{{ this.userX }}

Amallar: {{ operations }}

 

Ushbu simulyatsiyada ko‘rishimiz mumkin bo‘lgan Bubble Sort’dan eng muhim farq shundaki, Selection Sort uchun eng yaxshi va eng yomon holatlar amalda deyarli bir xil (\(O(n^2)\)), Bubble Sort uchun esa eng yaxshi holatdagi bajarilish vaqti atigi \(O(n)\).

Selection Sort uchun eng yaxshi va eng yomon holatlar o‘rtasidagi farq asosan almashtirishlar sonida. Eng yaxshi holatda Selection Sort hech bir qiymatni almashtirishi shart emas, chunki massiv allaqachon saralangan. Eng yomon holatda esa massiv allaqachon saralangan, lekin teskari tartibda bo‘ladi, shuning uchun Selection Sort massivda qancha qiymat bo‘lsa, shuncha almashtirish bajarishi kerak.


DSA mashqlari

Mashqlar yordamida o‘zingizni sinang

Mashq:

Ushbu massivga Selection Sort’ni qo‘llab:

[7,12,9,11,3]

Qiymatlarni chapdan o‘ngga o‘sish tartibida saralash uchun.

Birinchi o‘tishdan keyin OXIRGI elementning qiymati qanday bo‘ladi?



Mashqni boshlash



W3Schools Pathfinder

Yutuqlaringizni kuzating – bu bepul!