Tez Tartiblash. Tartiblash algoritmlari.
Salom! Bugun ham katta mavzu - Tez tartiblash [Quick sort].
😇
Github:
QuickSort
⏰
Time complexity:
Eng yaxshi holat: O(N * logN),
Eng yomon holat: O(N ^ 2).
🔎
Space complexity: O(1).
🧑💻 G'oya 🧑💻
Quick sort bu tezligi kvadrat funksiyaga ega bo'lgan tartiblash algoritmlardan [
Bubble sort,
Selection sort, and
Insertion sort] ancha tezroq ishlaydigan algoritm (o'rta holatda).
Bu algoritm uchta qismdan iborat:
- Massivni yoki uning qismini ikki qismga bo'lish. Chap qismida asos qilib olingan sondan kichikroq va o'ng qismida shu sondan kattaroq elementlar joylashtiriladi.
- Huddi shu metodni rekursiv chaqiruv orqali chap qism uchun ishlatish.
- Shu metodni rekursiv chaqiruv orqali bu safar o'ng qism uchun ishlatish.
Massivni kichikroq qismlarga bo'lish deganda massivni ikkita guruhga asos (tayanch) qilib oningan songa qarshi bo'lishni tushunish kerak. Shunda chap guruhdagi sonlar tayanch sondan kichikroq va o'ng guruhdagi sonlar esa shu tayanch sonidan kattaroq bo'lishi lozim.
🧑💻 Algoritm 🧑💻
Tepada Github-dagi yechimga havola qoldirganman.
Shu yechimda hamma logic QuickSort klassining ichida. Bu klassda array massivi bor. U tartiblash uchun berilgan massivga ko'rsatgichni saqlaydi.
QuickSort klassida yana 4 metod bor. Bular quickSort(), recursiveQuickSort(), partitionIt() va swap().
👩💻 quickSort()
Klassga tegishli massiv o'zgaruvchisiga berilgan massivni yozib qo'yadi. Keyin esa recursiveQuickSort() rekursiv metodini 0 va oxirgi indekslar uchun chaqiradi.
👩💻 recursiveQuickSort()
- Boshida rekursiya uchun asosiy holat tekshiriladi.
- else blokining ichida quyidagi 4ta harakat bajariladi:
1. Tayanch sonini tanlaysiz. Buning uchun berilgan diapazondan oxirgi elementni tanlaysiz.
2. partitionIt() metodini chaqirish orqali shu tayanch sonining indeksi aniqlanadi. Bu metod tayanchdan kichik sonlarni chapga va kattaroq sonlarni o'nga joylashtiradi.
3. Keyin rekursiv chaqiruv orqali recursiveQuickSort() metodini chap guruh uchun chaqirasiz.
4. Bundan keyin rekursiv chaqiruv orqali recursiveQuickSort() metodini o'ng guruh uchun chaqirasiz.
👩💻 partitionIt()
Metodning boshlanishida berilgan diapazon [left - right] ichida bosh va oxirgi indekslar uchun alohida int o'zgaruvchilarini yaratasiz.
Bulardan keyin bitta tashqi va ikkita ichki while loop-lar joylashgan.
- Birinchi ichki while loop tayanch sondan katta bo'lgan birinchi sonning indeksini topib beradi.
- Ikkinchi ichki while loop esa tayanch sondan kichik bo'lgan oxirgi sonning indeksini topadi.
- Agar shu ikkita indeks teng bo'lsa yoki leftPointer rightPointer-dan kattaroq bo'lsa, unda berilgan diapazondagi sonlar tayanch songa nisbatan to'g'ri taqsimlangan. Bu holatda tashqi loop-dan chiqib ketiladi.
- Agar chap ko'rsatgich indeks o'ng ko'rsatgich indeksdan kichik bo'lsa, biz shu indeks ostida joylashgan elementlarning swap() orqali joylarini almashtiramiz.
Bu harakatlar orqali siz tayanch sondan kichik sonlarni chapga va undan katta sonlarni unga nisbatan o'nga joylashtirasiz.
Tashqi while loop-dan chiqqaningizda swap() orqali tayanch sonini o'z o'rniga qo'yasiz.
Oxirida esa shu sonning indeksini qaytarasiz.
👩💻 swap()
Bu oddiy ikkita elementni indekslari bo'yicha joylarini almashtiruvchi metod.
Manbalar:
1. Data Structures and Algorithms in Java. R. Lafore.
2.
Quick Sort in 4 minutes
3.
Quick Sort gif
Bugunga shu.
Agar xatolar topsangiz yoki qaysidir qism bo'yicha savollaringiz bo'lsa, comments-da yozing.
Omad! ✌️😎
@LeetCodin