Heap sort haqida
![Mundarija
Kirish. Uyumni saralash algoritmi ................................................................................................................ 2
I bob. Heap sort ........................................................................................................................................... 2
1.1.Heap sort algoritmi haqida .................................................................................................................... 3
1.2.heap sort algoritmini c++ da kodi ........................................................................................................ 13
Uymli saralash murakkabligi ...................................................................................................................... 14
Xulosa. ....................................................................................................................................................... 26
Manbalar ................................................................................................................................................... 27
1](/data/documents/7a96d952-5241-461e-a59c-690b1c1d5f71/page_1.png)
![Kirish. Uyumni saralash algoritmi
Heap Sort - bu kompyuter dasturlashda mashhur va samarali tartiblash
algoritmi . Uyumli tartiblash algoritmini yozishni o'rganish uchun ikki turdagi
ma'lumotlar tuzilmalarini - massivlarni va daraxtlarni bilish kerak.
I bob. Heap sort
Biz tartiblamoqchi bo'lgan dastlabki raqamlar to'plami massivda saqlanadi,
masalan [10, 3, 76, 34, 23, 32], tartiblangandan so'ng biz tartiblangan massivni
olamiz [3,10,23,32,34,76].
Uyumni saralash massiv elementlarini to'liq ikkilik daraxtning maxsus turi
sifatida tasvirlash orqali ishlaydi.
Eslatma: Majburiy shart sifatida siz to'liq ikkilik daraxt va yig'ma
ma'lumotlar tuzilishi haqida bilishingiz kerak .
Massiv indekslari va daraxt elementlari o'rtasidagi bog'liqlik
To'liq ikkilik daraxt qiziqarli xususiyatga ega bo'lib, biz har qanday
tugunning bolalari va ota-onalarini topish uchun foydalanishimiz mumkin.
Agar massivdagi biron bir elementning indeksi bo'lsai,
indeksdagi 2i+1element chap bolaga, 2i+2indeksdagi element esa o'ng
yordamchiga aylanadi. Shuningdek, indeksdagi har qanday elementning ota-onasi i
ning pastki chegarasi bilan berilgan (i-1)/2.
Massiv va to'p
indekslari o'rtasidagi bog'liqlik
Keling, sinab ko'raylik,
Chap bola 1 (indeks 0)
= (2*0+1) indeksdagi element
= 1 indeksdagi element
= 12
1 bolaning o'ng farzandi
2](/data/documents/7a96d952-5241-461e-a59c-690b1c1d5f71/page_2.png)
![= (2*0+2) indeksdagi element
= 2 indeksdagi element
= 9
Xuddi shunday,
12 yoshli chap bola (indeks 1)
= (2*1+1) indeksdagi element
= 3 indeksdagi element
= 5
12 yoshli o'ng bola
= (2*1+2) indeksdagi element
= 4 indeksdagi element
= 6
Keling, har qanday tugunning ota-onasini topish uchun qoidalar mavjudligini
tasdiqlaylik
9 bolaning ota-onasi (2-pozitsiya)
= (2-1)/2
= ½
= 0,5
~ 0 indeks
= 1
12 yoshli ota-ona (1-pozitsiya)
= (1-1)/2
= 0 indeks
= 1
Massiv indekslarini daraxt pozitsiyalariga solishtirishni tushunish, yig'ma
ma'lumotlar tuzilmasi qanday ishlashini va undan yig'ish saralashni amalga
oshirishda qanday ishlatilishini tushunish uchun juda muhimdir.
Uyma ma'lumotlar strukturasi nima?
1.1.Heap sort algoritmi haqida
Heap - bu daraxtga asoslangan maxsus ma'lumotlar tuzilmasi. Ikkilik daraxt
to'plangan ma'lumotlar strukturasiga amal qiladi, deyiladi if
bu to'liq ikkilik daraxtdir
Daraxtdagi barcha tugunlar o'z farzandlaridan katta bo'lgan xususiyatga amal
qiladi, ya'ni eng katta element ildizda va uning ikkala bolalari va ildizdan
kichikroq va hokazo. Bunday to'p max-heap deb ataladi. Buning o'rniga, barcha
tugunlar o'z farzandlaridan kichikroq bo'lsa, u min-to'p deb ataladi
3](/data/documents/7a96d952-5241-461e-a59c-690b1c1d5f71/page_3.png)
![Quyidagi misol diagrammasi Max-Heap va Min-Heapni ko'rsatadi.
4](/data/documents/7a96d952-5241-461e-a59c-690b1c1d5f71/page_4.png)
![Maks to'p va min yig'im
Daraxtni qanday qilib
"to'plash" mumki n.
To'liq ikkilik daraxtdan
boshlab, biz to'plamning
barcha barg bo'lmagan
elementlarida heapify deb
nomlangan funktsiyani
ishga tushirish orqali uni
Max-Heapga
aylantirishimiz mumkin.
Heapify rekursiyadan foydalanganligi sababli, uni tushunish qiyin bo'lishi
mumkin. Shunday qilib, keling, birinchi navbatda, uchta element bilan daraxtni
qanday yig'ish kerakligini o'ylab ko'raylik.
heapify(array)
Root = array[0]
Largest = largest( array[0] , array [2*0 + 1]. array[2*0+2])
if(Root != Largest)
Swap(Root, Largest)
5](/data/documents/7a96d952-5241-461e-a59c-690b1c1d5f71/page_5.png)
![Asosiy holatlarni yig'ish
Yuqoridagi misol ikkita stsenariyni ko'rsatadi - bittasida ildiz eng katta
element bo'lib, biz hech narsa qilishimiz shart emas. Va yana birida, ildiz
bolaligida kattaroq elementga ega edi va biz max-heap xususiyatini saqlab qolish
uchun almashtirishimiz kerak edi.
Agar siz ilgari rekursiv algoritmlar bilan ishlagan bo'lsangiz, ehtimol bu
asosiy holat bo'lishi kerakligini aniqlagansiz.
Keling, bir nechta darajalar mavjud bo'lgan boshqa stsenariyni ko'rib chiqaylik.
Agar uning pastki daraxtlari allaqachon maksimal to'p bo'lsa, ildiz elementini
qanday yig'ish kerak
Yuqori element maksimal to'p emas, lekin barcha pastki daraxtlar maksimal
to'plardir.
Butun daraxt uchun max-heap xususiyatini saqlab qolish uchun u o ziningʻ
to g ri holatiga yetguncha 2-ni pastga bosishda davom etishimiz kerak bo ladi.
ʻ ʻ ʻ
6](/data/documents/7a96d952-5241-461e-a59c-690b1c1d5f71/page_6.png)
![I
ldiz elementining pastki daraxtlari maksimal to'p bo'lsa, uni qanday yig'ish kerak
Shunday qilib, har ikkala pastki daraxt ham max-heap bo‘lgan daraxtda
max-heap xususiyatini saqlab qolish uchun ildiz elementi uning bolalaridan
kattaroq bo‘lguncha yoki barg tuguniga aylanmaguncha heapify-ni qayta-qayta
ishga tushirishimiz kerak.
Biz bu ikkala shartni bitta to'plash funktsiyasida birlashtira olamiz
void heapify(int arr[], int n, int i) {
// Find largest among root, left child and right child
int largest = i;
int left = 2 * i + 1;
int right = 2 * i + 2;
if (left < n && arr[left] > arr[largest])
largest = left;
if (right < n && arr[right] > arr[largest])
largest = right;
// Swap and continue heapifying if root is not largest
if (largest != i) {
swap(&arr[i], &arr[largest]);
heapify(arr, n, largest);
}
}
Bu funksiya asosiy korpus uchun ham, har qanday o‘lchamdagi daraxt uchun
ham ishlaydi. Shunday qilib, pastki daraxtlar maksimal to'p bo'lsa, har qanday
daraxt o'lchami uchun maksimal to'p holatini saqlab qolish uchun ildiz elementini
to'g'ri joyga ko'chirishimiz mumkin.
Maksimal to'pni yarating
Har qanday daraxtdan maksimal to'pni qurish uchun biz har bir kichik
daraxtni pastdan yuqoriga yig'ishni boshlashimiz mumkin va funktsiya barcha
7](/data/documents/7a96d952-5241-461e-a59c-690b1c1d5f71/page_7.png)
![elementlarga, shu jumladan ildiz elementiga ham qo'llanilgandan so'ng, maksimal
to'p bilan yakunlanishi mumkin.
To'liq daraxt bo'lsa, barg bo'lmagan tugunning birinchi indeksi bilan beriladi n/2 -
1. Undan keyingi barcha boshqa tugunlar barg tugunlaridir va shuning uchun
to'planishi shart emas.
Shunday qilib, biz maksimal to'pni yaratishimiz mumkin
// Build heap (rearrange array)
for (int i = n / 2 - 1; i >= 0; i--)
heapify(arr, n, i);
Massiv yarating va i ni
hisoblang
8](/data/documents/7a96d952-5241-461e-a59c-690b1c1d5f71/page_8.png)
![Uyumni saralash uchun maksimal
to'pni yaratish qadamlariUyumni
saralash uchun maksimal to'pni
yaratish qadamlari
9](/data/documents/7a96d952-5241-461e-a59c-690b1c1d5f71/page_9.png)
![Uyumni saralash uchun maksimal to'pni yaratish qadamlari
Yuqoridagi diagrammada ko'rsatilganidek, biz eng pastki eng kichik
daraxtlarni to'plashdan boshlaymiz va ildiz elementiga yetguncha asta-sekin
yuqoriga ko'taramiz.
Agar siz shu paytgacha hamma narsani tushungan bo'lsangiz, tabriklaymiz,
siz yig'ish turini o'zlashtirish yo'lidasiz.
Uyumni saralashda ishlash
Daraxt Max-Heap xususiyatini qondirganligi sababli, eng katta element ildiz
tugunida saqlanadi.
Almashtirish: Ildiz elementini olib tashlang va massivning oxiriga qo'ying
(n-pozitsiya) Daraxtning oxirgi elementini (uyni) bo'sh joyga qo'ying.
O'chirish: Uyum hajmini 1 ga kamaytiring.
Heapify: Ildiz elementini yana yig'ing, shunda biz ildizda eng yuqori
elementga ega bo'lamiz.
Jarayon ro'yxatning barcha elementlari saralanmaguncha takrorlanadi.
10](/data/documents/7a96d952-5241-461e-a59c-690b1c1d5f71/page_10.png)
![11](/data/documents/7a96d952-5241-461e-a59c-690b1c1d5f71/page_11.png)
![Al
mashtirish, o'chirish va yig'ish
12](/data/documents/7a96d952-5241-461e-a59c-690b1c1d5f71/page_12.png)
![Quyidagi kod operatsiyani ko'rsatadi.
// Heap sort
for (int i = n - 1; i >= 0; i--) {
swap(&arr[0], &arr[i]);
1.2.heap sort algoritmini c++ da kodi
// Heapify root element to get highest element at root again
heapify(arr, i, 0);
}
#include <iostream>
using namespace std;
void heapify(int arr[], int n, int i) {
// Find largest among root, left child and right child
int largest = i;
int left = 2 * i + 1;
int right = 2 * i + 2;
if (left < n && arr[left] > arr[largest])
largest = left;
if (right < n && arr[right] > arr[largest])
largest = right;
// Swap and continue heapifying if root is not largest
if (largest != i) {
swap(arr[i], arr[largest]);
heapify(arr, n, largest);
}
}
// main function to do heap sort
void heapSort(int arr[], int n) {
// Build max heap
for (int i = n / 2 - 1; i >= 0; i--)
heapify(arr, n, i);
// Heap sort
for (int i = n - 1; i >= 0; i--) {
swap(arr[0], arr[i]);
// Heapify root element to get highest element at root again
heapify(arr, i, 0);
}
}
13](/data/documents/7a96d952-5241-461e-a59c-690b1c1d5f71/page_13.png)
![// Print an array
void printArray(int arr[], int n) {
for (int i = 0; i < n; ++i)
cout << arr[i] << " ";
cout << "\n";
}
// Driver code
int main() {
int arr[] = {1, 12, 9, 5, 6, 10};
int n = sizeof(arr) / sizeof(arr[0]);
heapSort(arr, n);
cout << "Sorted array is \n";
printArray(arr, n);
}
Uymli saralash murakkabligi
Vaqtning murakkabligi
Eng yaxshi O(nlog n)
Eng yomoni O(nlog n)
O'rtacha O(nlog n)
Heap Sort O(nlog n)barcha holatlar uchun vaqt murakkabligiga ega (eng
yaxshi holat, o'rtacha holat va eng yomon holat).
Buning sababini tushunaylik. Tarkibida n ta element bo lgan to liq ikkilikʻ ʻ
daraxtning balandligilog n
Yuqorida aytib o'tganimizdek, pastki daraxtlari allaqachon max-uymalar
bo'lgan elementni to'liq yig'ish uchun biz elementni chap va o'ng bolalari bilan
solishtirishni davom ettirishimiz va ikkala bolasi ham kichikroq bo'lgan nuqtaga
yetguncha uni pastga surishimiz kerak.
Eng yomon stsenariyda biz elementni ildizdan barg tuguniga ko'chirishimiz kerak,
bu ko'p log(n)taqqoslash va almashtirish.
build_max_heap bosqichida biz buni n/2elementlar uchun qilamiz, shuning uchun
build_heap bosqichining eng yomon murakkabligi n/2*log n ~ nlog n.
Saralash bosqichida biz ildiz elementini oxirgi element bilan almashtiramiz
va ildiz elementini yig'amiz. Har bir element uchun bu yana log neng yomon
14](/data/documents/7a96d952-5241-461e-a59c-690b1c1d5f71/page_14.png)
![vaqtni oladi, chunki biz elementni ildizdan barggacha olib borishimiz kerak
bo'lishi mumkin. Buni takrorlaganimizdan berinmarta, heap_sort bosqichi
ham nlog n.
Shuningdek, build_max_heapva heap_sortbosqichlari ketma-ket bajarilganligi
sababli, algoritmik murakkablik ko'paytirilmaydi va u tartibda qoladi nlog n.
O(1)Shuningdek, u kosmik murakkablikda saralashni amalga oshiradi . Tez
tartiblash bilan solishtirganda, u eng yomon holatga ega ( O(nlog n) ). Tez
tartiblash O(n^2)eng yomon holatda murakkablikka ega. Ammo boshqa hollarda
Tez tartiblash tezdir. Introsort - bu har ikkalasining afzalliklarini saqlab qolish
uchun tez va yig'ma saralashni birlashtirgan yig'ma saralashga muqobildir:
yig'ishning eng yomon holati va tez saralashning o'rtacha tezligi.
Uyma tartiblash ilovalari
Xavfsizlik bilan bog'liq tizimlar va Linux yadrosi kabi o'rnatilgan
tizimlar O(n log n)Heapsort ish vaqtining O(1)yuqori chegarasi va yordamchi
xotirasida doimiy yuqori chegarasi tufayli Heap Sortdan foydalanadi.
Garchi “Heap Sort O(n log n)” eng yomon holatda ham vaqt murakkabligiga
ega bo lsa-da, u ko proq ilovalarga ega emas (Tezkor saralash, Birlashtirishʻ ʻ
Saralash kabi boshqa tartiblash algoritmlariga nisbatan). Biroq, agar biz qolgan
elementlarni tartiblangan tartibda saqlash uchun qo'shimcha xarajatlarsiz
elementlar ro'yxatidan eng kichigini (yoki eng kattasini) ajratib olishni istasak,
uning asosiy ma'lumotlar strukturasidan samarali foydalanish mumkin. Masalan,
Priority Queues uchun.
O'xshash tartiblash algoritmlari
Tez tartiblash
Birlashtirish tartibi
Uyma tartiblash nima
Uyma tartiblash - bu ikkilik uyum ma'lumotlar tuzilishiga asoslangan
taqqoslashga asoslangan tartiblash usuli . Bu birinchi navbatda minimal elementni
topadigan va minimal elementni boshiga joylashtirgan tanlash tartibiga
o'xshaydi. Qolgan elementlar uchun xuddi shu jarayonni takrorlang.
Uyma tartiblash - bu o'z joyida algoritm.
Uning odatiy amalga oshirilishi barqaror emas, lekin barqaror bo'lishi mumkin
( qarang )
Odatda yaxshi amalga oshirilgan QuickSort ga qaraganda 2-3 baravar
sekinroq . Sekinlik sababi - mos yozuvlar joyining yo'qligi.
Heapsortning afzalliklari:
Samaradorlik - Uyma tartibini bajarish uchun zarur bo'lgan vaqt logarifmik
ravishda oshadi, boshqa algoritmlar esa saralanadigan elementlar soni ortishi bilan
15](/data/documents/7a96d952-5241-461e-a59c-690b1c1d5f71/page_15.png)
![eksponent ravishda sekinlashishi mumkin. Ushbu tartiblash algoritmi juda
samarali.
Xotiradan foydalanish - Xotiradan foydalanish minimal, chunki saralanadigan
elementlarning dastlabki ro'yxatini saqlash uchun zarur bo'lgan narsalardan
tashqari, ishlash uchun qo'shimcha xotira maydoni kerak emas.
Oddiylik - Boshqa teng darajada samarali tartiblash algoritmlariga
qaraganda tushunish osonroq, chunki u rekursiya kabi ilg'or informatika
tushunchalaridan foydalanmaydi.
HeapSort ilovalari:
Heapsort asosan IntroSort kabi gibrid algoritmlarda qo'llaniladi .
Deyarli tartiblangan (yoki K tartiblangan) massivni saralash
massivdagi k eng katta (yoki eng kichik) elementlar
Uyumni saralash algoritmi cheklangan foydalanishga ega, chunki Quicksort
va Mergesort amalda yaxshiroq. Shunga qaramay, Heap ma'lumotlar
strukturasining o'zi juda ko'p ishlatiladi.
Muammoni Hal Qilish
Yuborilganlar soni: 68.2K
Heapify nimani anglatadi?
Heapify - massiv yordamida ifodalangan ikkilik daraxtdan yig'ma
ma'lumotlar strukturasini yaratish jarayoni. U Min-Heap yoki Max-heap yaratish
uchun ishlatiladi. Indeksi n/2 – 1 bilan berilgan bargsiz tugunning birinchi
indeksidan boshlang. Heapify rekursiyadan foydalanadi.
Heapify uchun algoritm:
heapify(massiv)
Root = massiv[0]
Eng katta = eng katta( massiv[0] , massiv [2 * 0 + 1]/ massiv[2 * 0 + 2])
if(Root != Eng katta)
Swap(Root, Largest)
Heapify qanday ishlaydi?
Massiv = {1, 3, 5, 4, 6, 13, 10, 9, 8, 15, 17}
Tegishli to liq ikkilik daraxt:ʻ
Yuqoridagi massivdan Max-Heap qurish vazifasi .
16](/data/documents/7a96d952-5241-461e-a59c-690b1c1d5f71/page_16.png)
![Jami tugunlar = 11.
Jami bargsiz tugunlar= (11/2)-1=5
oxirgi bargsiz tugun = 6.
Shuning uchun, oxirgi barg bo'lmagan tugun indeksi = 4.
Uyumni qurish uchun faqat tugunlarni to'plang: [1, 3, 5, 4, 6] teskari tartibda.
Heapify 6 : 6 va 17-ni almashtiring.
Heapify 4 : 4 va 9-ni almashtiring.
Heapify 5 : 13 va 5 ni almashtiring.
Heapify 3 : Avval 3 va 17 ni almashtiring, yana 3 va 15 ni almashtiring.
17](/data/documents/7a96d952-5241-461e-a59c-690b1c1d5f71/page_17.png)
![Heapify 1 : Avval 1 va 17 ni almashtiring, yana 1 va 15 ni almashtiring, nihoyat 1
va 6 ni almashtiring.
Uyumni saralash algoritmi
Muammoni hal qilish uchun quyidagi fikrga amal qiling:
Avval massivni heapify-dan foydalanib yig'ma ma'lumotlar strukturasiga
aylantiring, so'ngra Max-heapning ildiz tugunini birin-ketin o'chiring va uni
uyumdagi oxirgi tugun bilan almashtiring va keyin uyumning ildizini
yig'ing. Uyumning o'lchami 1 dan katta bo'lguncha bu jarayonni takrorlang.
Muammoni hal qilish uchun quyidagi amallarni bajaring:
Kirish ma'lumotlaridan maksimal to'p hosil qiling.
Bu vaqtda maksimal element to'pning ildizida saqlanadi. Uni to'plamning
oxirgi elementi bilan almashtiring, so'ngra to'plam hajmini 1 ga kamaytiring.
Nihoyat, daraxt ildizini to'plang.
Uyumning o'lchami 1 dan katta bo'lganda 2-bosqichni takrorlang.
Eslatma: Tugunga to'g'rilash jarayoni faqat uning asosiy tugunlari yig'ilgan bo'lsa,
qo'llanilishi mumkin. Shunday qilib, yig'ish pastdan yuqoriga qarab amalga
oshirilishi kerak.
Uyma tartiblashning batafsil ishlashi
Uyma tartiblashni aniqroq tushunish uchun keling, tartiblanmagan massivni
olaylik va uni yig'ma tartiblash yordamida saralashga harakat qilaylik.
Massivni ko'rib chiqing: arr[] = {4, 10, 3, 5, 1}.
To'liq ikkilik daraxtni yaratish: massivdan to'liq ikkilik daraxtni yarating.
18](/data/documents/7a96d952-5241-461e-a59c-690b1c1d5f71/page_18.png)
![Massivdan to'liq ikkilik daraxtni yarating
Maksimal to'pga aylantirish: Shundan so'ng, vazifa o'sha tartiblanmagan
massivdan daraxt qurish va uni maksimal to'pga aylantirishga harakat qilishdir .
Uyumni maksimal yig'maga aylantirish uchun asosiy tugun har doim kichik
tugunlardan katta yoki teng bo'lishi kerak
Bu erda, ushbu misolda, ota-tugun 4 10 -chi tugundan kichikroq bo'lgani
uchun , ularni maksimal yig'ish uchun almashtiring.
Uni maksimal yig'ma tasvir vidjetiga aylantiring
Endi, ko'rinib turganidek, ota-ona sifatida 4 bola 5 dan kichikroq , shuning
uchun ikkalasini ham almashtiring va natijada yig'in va massiv quyidagicha bo'lishi
kerak:
Daraxtni maksimal to'pga aylantiring
19](/data/documents/7a96d952-5241-461e-a59c-690b1c1d5f71/page_19.png)
![Uyumni saralashni amalga oshiring: Har bir qadamda maksimal elementni
olib tashlang (ya'ni, uni oxirgi holatga o'tkazing va uni olib tashlang) va keyin
qolgan elementlarni ko'rib chiqing va uni maksimal to'pga aylantiring.
Ildiz elementni (10) maksimal to'pdan o'chiring. Ushbu tugunni o'chirish
uchun uni oxirgi tugun bilan almashtirishga harakat qiling, ya'ni (1). Ildiz
elementni olib tashlaganingizdan so'ng, uni maksimal to'plamga aylantirish uchun
yana yig'ing.
Natijadagi to'p va massiv quyidagicha ko'rinishi kerak:
10 ni olib tashlang va heapify qiling
Yuqoridagi amallarni takrorlang va u quyidagicha ko'rinadi:
20](/data/documents/7a96d952-5241-461e-a59c-690b1c1d5f71/page_20.png)
![5 ni olib tashlang va heapify qiling
Endi ildizni (ya'ni 3) yana olib tashlang va heapify-ni bajaring.
4 ni olib tashlang va heapify qiling
Endi ildiz yana bir marta olib tashlanganda, u tartiblanadi. va tartiblangan
massiv arr[] = {1, 3, 4, 5, 10} kabi bo'ladi.
21](/data/documents/7a96d952-5241-461e-a59c-690b1c1d5f71/page_21.png)
![Saralangan massiv
Uyma tartibini amalga oshirish
Quyida yuqoridagi yondashuvni amalga oshirish ko'rsatilgan:
C++
// Heap Sort in C
#include <stdio.h>
// Function to swap the position of two elements
void swap(int* a, int* b)
{
int temp = *a;
*a = *b;
*b = temp;
}
// To heapify a subtree rooted with node i
// which is an index in arr[].
// n is size of heap
void heapify(int arr[], int N, int i)
{
// Find largest among root, left child and right child
// Initialize largest as root
int largest = i;
// left = 2*i + 1
int left = 2 * i + 1;
// right = 2*i + 2
int right = 2 * i + 2;
// If left child is larger than root
if (left < N && arr[left] > arr[largest])
largest = left;
22](/data/documents/7a96d952-5241-461e-a59c-690b1c1d5f71/page_22.png)
![// If right child is larger than largest
// so far
if (right < N && arr[right] > arr[largest])
largest = right;
// Swap and continue heapifying if root is not largest
// If largest is not root
if (largest != i) {
swap(&arr[i], &arr[largest]);
// Recursively heapify the affected
// sub-tree
heapify(arr, N, largest);
}
}
// Main function to do heap sort
void heapSort(int arr[], int N)
{
// Build max heap
for (int i = N / 2 - 1; i >= 0; i--)
heapify(arr, N, i);
// Heap sort
for (int i = N - 1; i >= 0; i--) {
swap(&arr[0], &arr[i]);
// Heapify root element to get highest element at
// root again
heapify(arr, i, 0);
}
}
// A utility function to print array of size n
void printArray(int arr[], int N)
{
for (int i = 0; i < N; i++)
printf("%d ", arr[i]);
printf("\n");
}
// Driver's code
int main()
{
23](/data/documents/7a96d952-5241-461e-a59c-690b1c1d5f71/page_23.png)
![int arr[] = { 12, 11, 13, 5, 6, 7 };
int N = sizeof(arr) / sizeof(arr[0]);
// Function call
heapSort(arr, N);
printf("Sorted array is\n");
printArray(arr, N);
}
Chiqish
Saralangan massiv
5 6 7 11 12 13
Vaqt murakkabligi: O(N log N)
Yordamchi fazo: O(1)
Uyma tartiblash bilan bog'liq ba'zi tez-tez so'raladigan savollar
Uyma tartiblashning ikki bosqichi qanday?
Uyumni saralash algoritmi ikki bosqichdan iborat. Birinchi bosqichda
massiv maksimal to'pga aylantiriladi. Va ikkinchi bosqichda eng yuqori element
(ya'ni, daraxt ildizidagi) olib tashlanadi va qolgan elementlar yangi max to'pni
yaratish uchun ishlatiladi.
Nima uchun Uyma tartiblash barqaror emas?
Uyma tartiblash algoritmi barqaror algoritm emas. Bu algoritm barqaror
emas, chunki uyada bajariladigan amallar ekvivalent kalitlarning nisbiy tartibini
o'zgartirishi mumkin.
Heap Sort "Bo'l va zabt et" algoritmiga misolmi?
Uyma tartiblash umuman Bo'l va bosib ol algoritmi EMAS . U elementlarni
saralash uchun “bo‘l va zabt et” yondashuvidan emas, balki uning elementini
samarali saralash uchun yig‘ma ma’lumotlar strukturasidan foydalanadi.
Qaysi tartiblash algoritmi yaxshiroq - yig'ish tartibi yoki birlashtirish tartibi?
Javob ularning vaqt murakkabligi va makonga bo'lgan talabni taqqoslashda
yotadi. Birlashtirish tartibi Uyma tartiblashdan biroz tezroq. Biroq, boshqa
tomondan, birlashtirish tartibi qo'shimcha xotirani oladi. Talabga qarab, qaysi
birini ishlatishni tanlash kerak.
Nima uchun Uyma tartiblash Tanlashdan yaxshiroq?
Uyumni saralash tanlov tartibiga o'xshaydi, lekin maksimal elementni
olishning yaxshiroq usuli bilan. Doimiy vaqtda maksimal elementni olish uchun u
yig'ma ma'lumotlar strukturasidan foydalanadi.
Uyma tartiblash umuman Bo'l va bosib ol algoritmi EMAS . U elementlarni
saralash uchun “bo‘l va zabt et” yondashuvidan emas, balki uning elementini
samarali saralash uchun yig‘ma ma’lumotlar strukturasidan foydalanadi.
24](/data/documents/7a96d952-5241-461e-a59c-690b1c1d5f71/page_24.png)
![Qaysi tartiblash algoritmi yaxshiroq - yig'ish tartibi yoki birlashtirish tartibi?
Javob ularning vaqt murakkabligi va makonga bo'lgan talabni taqqoslashda
yotadi. Birlashtirish tartibi Uyma tartiblashdan biroz tezroq. Biroq, boshqa
tomondan, birlashtirish tartibi qo'shimcha xotirani oladi. Talabga qarab, qaysi
birini ishlatishni tanlash kerak.
uchun Uyma tartiblash Tanlashdan yaxshiroq?
Uyumni saralash tanlov tartibiga o'xshaydi, lekin maksimal elementni
olishning yaxshiroq usuli bilan. Doimiy vaqtda maksimal elementni olish uchun u
yig'ma ma'lumotlar strukturasidan foydalanadi.Heap Sort - bu kompyuter
dasturlashda mashhur va samarali tartiblash algoritmi hisoblanadi .Uyumli
tartiblash algoritmini yozishni o'rganishimiz uchun ikki turdagi ma'lumotlar
tuzilmalarini - massivlarni va daraxtlarni bilishimiz kerak.
25](/data/documents/7a96d952-5241-461e-a59c-690b1c1d5f71/page_25.png)
![Xulosa.
Biz saralash algaritimlari haqida tanishib oldik. Heap - bu daraxtga
asoslangan maxsus ma'lumotlar tuzilmasi hisoblanadi . Ikkilik daraxt to'plangan
ma'lumotlar strukturaga ega bo lishi kerak.ʻ
Tarkibida n ta element ega bo lgan to liq ikkilik daraxtning balandligi log n
ʻ ʻ
bo ladi.
ʻ Avzalligi
1- Xotiradan foydalanish minimal, sababi saralanadigan elementlarning
dastlabki ro'yxatini saqlash uchun zarur bo'lgan narsalardan tashqari, ishlash uchun
qo'shimcha xotira maydoni kerak emas.Uyma tartiblash umuman Bo'l va bosib ol
algoritmi emas. U elementlarni saralash uchun “bo‘l va zabt et” yondashuvidan
emas, balki uning elementini samarali saralash uchun yig‘ma ma’lumotlar
strukturasidan foydalanadi. Kirish ma ' lumotlaridan maksimal to ' p hosil qilidim .
Bu vaqtda maksimal element to'pning ildizida saqlanadi. Uni to'plamning
oxirgi elementi bilan almashtirdim so'ngra to'plam hajmini 1 ga kamaydi. Nihoyat,
daraxt ildizini to'pladimVa shu tariqa yana shu algoritm asosida ma lumotlarni
ʼ
saraladim
Uyumning o'lchami 1 dan katta bo'lganda 2-bosqichni takrorladimTugunga
to'g'rilash jarayoni faqat uning asosiy tugunlari yig'ilgan bo'lsa, qo'llanilishi
mumkin. Shunday qilib, yig'ish pastdan yuqoriga qarab amalga oshirilishi kerak.
26](/data/documents/7a96d952-5241-461e-a59c-690b1c1d5f71/page_26.png)
![Manbalar
1. https://www.texnoman.uz/post/big-dataning-asosiy-8-atamasi_.html sayti
2. https://www.programiz.com/dsa/bubble-sort
3. https://www.programiz.com/dsa/selection-sort
4. https://www.programiz.com/dsa/insertion-sort
5. https://www.programiz.com/dsa/merge-sort
6. Dars qo‘llanmalar i.
27](/data/documents/7a96d952-5241-461e-a59c-690b1c1d5f71/page_27.png)
Mundarija Kirish. Uyumni saralash algoritmi ................................................................................................................ 2 I bob. Heap sort ........................................................................................................................................... 2 1.1.Heap sort algoritmi haqida .................................................................................................................... 3 1.2.heap sort algoritmini c++ da kodi ........................................................................................................ 13 Uymli saralash murakkabligi ...................................................................................................................... 14 Xulosa. ....................................................................................................................................................... 26 Manbalar ................................................................................................................................................... 27 1
Kirish. Uyumni saralash algoritmi Heap Sort - bu kompyuter dasturlashda mashhur va samarali tartiblash algoritmi . Uyumli tartiblash algoritmini yozishni o'rganish uchun ikki turdagi ma'lumotlar tuzilmalarini - massivlarni va daraxtlarni bilish kerak. I bob. Heap sort Biz tartiblamoqchi bo'lgan dastlabki raqamlar to'plami massivda saqlanadi, masalan [10, 3, 76, 34, 23, 32], tartiblangandan so'ng biz tartiblangan massivni olamiz [3,10,23,32,34,76]. Uyumni saralash massiv elementlarini to'liq ikkilik daraxtning maxsus turi sifatida tasvirlash orqali ishlaydi. Eslatma: Majburiy shart sifatida siz to'liq ikkilik daraxt va yig'ma ma'lumotlar tuzilishi haqida bilishingiz kerak . Massiv indekslari va daraxt elementlari o'rtasidagi bog'liqlik To'liq ikkilik daraxt qiziqarli xususiyatga ega bo'lib, biz har qanday tugunning bolalari va ota-onalarini topish uchun foydalanishimiz mumkin. Agar massivdagi biron bir elementning indeksi bo'lsai, indeksdagi 2i+1element chap bolaga, 2i+2indeksdagi element esa o'ng yordamchiga aylanadi. Shuningdek, indeksdagi har qanday elementning ota-onasi i ning pastki chegarasi bilan berilgan (i-1)/2. Massiv va to'p indekslari o'rtasidagi bog'liqlik Keling, sinab ko'raylik, Chap bola 1 (indeks 0) = (2*0+1) indeksdagi element = 1 indeksdagi element = 12 1 bolaning o'ng farzandi 2
= (2*0+2) indeksdagi element = 2 indeksdagi element = 9 Xuddi shunday, 12 yoshli chap bola (indeks 1) = (2*1+1) indeksdagi element = 3 indeksdagi element = 5 12 yoshli o'ng bola = (2*1+2) indeksdagi element = 4 indeksdagi element = 6 Keling, har qanday tugunning ota-onasini topish uchun qoidalar mavjudligini tasdiqlaylik 9 bolaning ota-onasi (2-pozitsiya) = (2-1)/2 = ½ = 0,5 ~ 0 indeks = 1 12 yoshli ota-ona (1-pozitsiya) = (1-1)/2 = 0 indeks = 1 Massiv indekslarini daraxt pozitsiyalariga solishtirishni tushunish, yig'ma ma'lumotlar tuzilmasi qanday ishlashini va undan yig'ish saralashni amalga oshirishda qanday ishlatilishini tushunish uchun juda muhimdir. Uyma ma'lumotlar strukturasi nima? 1.1.Heap sort algoritmi haqida Heap - bu daraxtga asoslangan maxsus ma'lumotlar tuzilmasi. Ikkilik daraxt to'plangan ma'lumotlar strukturasiga amal qiladi, deyiladi if bu to'liq ikkilik daraxtdir Daraxtdagi barcha tugunlar o'z farzandlaridan katta bo'lgan xususiyatga amal qiladi, ya'ni eng katta element ildizda va uning ikkala bolalari va ildizdan kichikroq va hokazo. Bunday to'p max-heap deb ataladi. Buning o'rniga, barcha tugunlar o'z farzandlaridan kichikroq bo'lsa, u min-to'p deb ataladi 3
Quyidagi misol diagrammasi Max-Heap va Min-Heapni ko'rsatadi. 4
Maks to'p va min yig'im Daraxtni qanday qilib "to'plash" mumki n. To'liq ikkilik daraxtdan boshlab, biz to'plamning barcha barg bo'lmagan elementlarida heapify deb nomlangan funktsiyani ishga tushirish orqali uni Max-Heapga aylantirishimiz mumkin. Heapify rekursiyadan foydalanganligi sababli, uni tushunish qiyin bo'lishi mumkin. Shunday qilib, keling, birinchi navbatda, uchta element bilan daraxtni qanday yig'ish kerakligini o'ylab ko'raylik. heapify(array) Root = array[0] Largest = largest( array[0] , array [2*0 + 1]. array[2*0+2]) if(Root != Largest) Swap(Root, Largest) 5