Keon lajittelualgoritmi (kanssa Code in Python ja C++)
โก รlykรคs yhteenveto
Keon lajittelualgoritmi lajittelee taulukon rakentamalla binรครคrikeon ja suorittamalla toistuvasti kokeentracsyรถttรคmรคllรค sen juuriarvon lajiteltuun osioon. Tรคmรค resurssi selittรครค heapify-, max- ja min-keot, pseudokoodin ja tรคydellisen Python ja C++ toteutukset aikakompleksisuusanalyysin avulla.

Mikรค on Keon lajittelualgoritmi?
Kekolajittelu on yksi suosituimmista ja nopeimmista lajittelualgoritmeista. Se perustuu tรคydelliseen binรครคripuun tietorakenteeseen. Etsimme suurimman mahdollisen elementin ja sijoitamme sen suurimman mahdollisen keon pรครคlle. Sijoitamme sen binรครคripuun ylรคsolmuun.
Oletetaan, ettรค matriisi on annettu, data = [10,5, 7, 9, 4, 11, 45, 17, 60].
Jos taulukossa i-th (i=0,1,2,3 โฆ) indeksi on pรครคsolmu, (2i+1) ja (2i+2) ovat vasen ja oikea lapsi. Tรคydellisen binรครคripuun luominen tรคllรค taulukolla nรคyttรครค tรคltรค:
Teemme kasaanmuodostusprosessin taulukon alusta loppuun. Aluksi, jos muunnamme taulukon puuksi, se nรคyttรครค yllรค olevalta. Voimme nรคhdรค, ettรค se ei yllรคpidรค mitรครคn keon ominaisuutta (min-heap tai max kaso). Saadaan lajiteltu matriisi tekemรคllรค kasatusprosessi kaikille solmuille.
Kekon lajittelun sovellus
Tรคssรค on keon lajittelualgoritmin kรคyttรถรค:
- "Priority Queues" -jonojen rakentaminen vaatii kasalajittelun. Koska heapsort pitรครค elementin lajiteltuna jokaisen lisรคyksen jรคlkeen.
- Keon tietorakenne on tehokas k:n lรถytรคmisessรคth suurin elementti tietyssรค taulukossa.
- Linux-ydin kรคyttรครค keon lajittelua oletuksena lajittelualgoritmi koska sillรค on O (1) avaruuden monimutkaisuus.
Luo Kekolajittelu esimerkin avulla
Tรคssรค rakennamme maksimikeon seuraavasta tรคydellisestรค binรครคripuusta.
Lehtisolmut ovat 17, 60, 4, 11 ja 45. Niillรค ei ole lapsisolmuja. Siksi ne ovat lehtisolmuja. Joten aloitamme kasaantumismenetelmรคn heidรคn ylรคsolmuksestaan. Tรคssรค ovat vaiheet:
Vaihe 1) Valitse vasemmanpuoleisin alipuu. Jos alisolmut ovat suurempia, vaihda pรครคsolmu alisolmun kanssa.
Tรคssรค ylรคsolmu on 9. Ja alasolmut ovat 17 ja 60. Koska 60 on suurin, 60 ja 9 vaihdetaan keskenรครคn yllรคpitรคmรครคn max kasa.
Vaihe 2) Nyt vasemmanpuoleisin alipuu on kasattu. Seuraava pรครคsolmu on 7. Tรคllรค pรครคsolmulla on kaksi alisolmua, ja suurin on 45. Joten 45 ja 7 vaihdetaan.
Vaihe 3) Solmuilla 60 ja 4 on ylรคsolmu 5. Koska "5" on pienempi kuin alisolmu 60, se vaihdetaan.
Vaihe 4) Nyt solmulla 5 on lapsisolmu 17,9. Tรคmรค ei yllรคpidรค maksimikeon ominaisuutta. Joten 5 korvataan 17:llรค.
Vaihe 5) Solmu 10 vaihdetaan 60:een ja sitten 17:รครคn. Prosessi nรคyttรครค seuraavalta.
Vaihe 6) Vaiheeseen 5 saakka loimme maksimikeon. Jokainen ylรคsolmu on suurempi kuin sen alisolmu. Juurisolmulla on suurin arvo (60).
Huomautus: Lajitellun taulukon luomiseksi meidรคn on korvattava maksimiarvoinen solmu sen seuraajalla.
Tรคtรค prosessia kutsutaan "extract-maksimiโ. Koska 60 on maksimisolmu, kiinnitรคmme sen sijainnin 0. indeksiin ja luomme kasan ilman solmua 60.
Vaihe 7) Kun 60 poistetaan, seuraava maksimiarvo on 45. Suoritamme prosessin โEsimerkkitract Maxโ uudelleen solmusta 45.
Tรคllรค kertaa saamme 45 ja korvaamme juurisolmun sen seuraajalla 17.
Meidรคn on suoritettava "Extract Max", kunnes kaikki elementit on lajiteltu.
Nรคiden vaiheiden jรคlkeen, kunnes olemmetrackaikki maksimiarvot, saamme seuraavan taulukon.
Mikรค on Binary Heap?
Binary Heap on erรครคnlainen tรคydellinen binaaripuu tietorakenne. Tรคllaisessa puurakenteessa pรครคsolmu on joko suurempi tai pienempi kuin lapsisolmut. Jos ylรคsolmu on pienempi, niin kasaa kutsutaan "Minimikekoksi" ja jos emosolmu on suurempi, kasaa kutsutaan "Max Heap".
Tรคssรค on esimerkkejรค minimikeosta ja maksimikeosta.

Jos yllรค olevassa kuvassa huomaat "Min Heap", pรครคsolmu on aina pienempi kuin sen alisolmut. Puun kรคrjestรค lรถytyy pienin arvo 10.
Samoin "Max Heap" -kohdassa ylรคsolmu on aina suurempi kuin alisolmut. Maksimielementti on "Max Heap" -pรครคsolmussa.
Mikรค on "Heapify"?
"Heapify" on kasan periaate, joka varmistaa solmun sijainnin. Heapifyssa maksimikeko yllรคpitรครค aina suhdetta vanhemman ja lapsen kanssa, mikรค tarkoittaa, ettรค ylรคsolmu on suurempi kuin alisolmut.
Esimerkiksi jos lisรคtรครคn uusi solmu, meidรคn on muotoiltava keko uudelleen. Saatamme kuitenkin joutua muuttamaan tai vaihtamaan solmuja tai jรคrjestelemรครคn taulukon uudelleen. Tรคmรค uudelleenjรคrjestรคmisprosessiping Kekoa kutsutaan "kekoksi".
Tรคssรค on esimerkki siitรค, kuinka heapify toimii:

Tรคssรค ovat kasaamisen vaiheet:
Vaihe 1) Lisรคtty solmu 65 solmun 60 oikeaksi lapseksi.
Vaihe 2) Tarkista, onko juuri lisรคtty solmu suurempi kuin pรครคsolmu.
Vaihe 3) Koska se on suurempi kuin emosolmu, vaihdoimme oikean lapsen sen ylรคtason kanssa.
Kuinka rakentaa kasa
Ennen kuin rakennat kasan tai kasaamme puun, meidรคn on tiedettรคvรค, kuinka sรคilytรคmme sen. Koska kasa on tรคydellinen binรครคripuu, on parempi kรคyttรครค a ryhmรค kasan tietojen sรคilyttรคmiseen.
Oletetaan, ettรค taulukko sisรคltรครค yhteensรค n elementtiรค. Jos "i":s indeksi on ylรคsolmu, vasen solmu on indeksissรค (2i+1), ja oikea solmu on indeksissรค (2i+2). Oletetaan, ettรค taulukkoindeksi alkaa 0:sta.
Tallennetaan tรคtรค kรคyttรคmรคllรค maksimikeko taulukon kaltaiseen seuraavaan:

Keonmuodostusalgoritmi yllรคpitรครค keon ominaisuutta. Jos vanhemmalla ei ole รครคriarvoa (pienempi tai suurempi), se vaihdetaan รครคrimmรคisimmรคn lapsisolmun kanssa.
Tรคssรค ovat vaiheet maksimikasan kasoittamiseksi:
Vaihe 1) Aloita lehden solmusta.
Vaihe 2) Etsi maksimi vanhemman ja lasten vรคlillรค.
Vaihe 3) Vaihda solmut, jos alisolmun arvo on suurempi kuin pรครคsolmun arvo.
Vaihe 4) Mene yksi taso ylรถspรคin.
Vaihe 5) Noudata vaiheita 2,3,4, kunnes saavutamme indeksin 0 tai lajittelemme koko puun.
Tรคssรค on pseudokoodi rekursiiviselle kasalle (maksimi kasa):
def heapify(): inputโ array, size, i largest = i left = 2*i + 1 right = 2*i + 2 if left<n and array[largest ] < array[left]: largest = left if right<n and array[largest ] < array[right]: largest = right If largest not equals i: swap(array[i],array[largest]) heapify(array,n,largest)
Pseudo Code keon lajittelua varten
Tรคssรค on pseudokoodi keon lajittelualgoritmille:
Heapify(numbers as an array, n as integer, i as integer): largest = i left = 2i+1 right= 2i+2 if(left<=n) and (numbers[i]<numbers[left]) largest=left if(right<=n) and (numbers[i]<numbers[right]) largest=right if(largest != i) swap(numbers[i], numbers[largest]) Heapify(numbers,n,largest) HeapSort(numbers as an array): n= numbers.size() for i in range n/2 to 1 Heapify(numbers,n,i) for i in range n to 2 Swap numbers[i] with numbers[1] Heapify(numbers,i,0)
Esimerkki kekolajittelusta Code in C++
#include <iostream> using namespace std; void display(int arr[], int n) { for (int i = 0; i < n; i++) { cout << arr[i] << "\t"; } cout << endl; } void heapify(int numbers[], int n, int i) { int largest = i; int left = 2 * i + 1; int right = 2 * i + 2; if (left < n && numbers[left] < numbers[largest]) { largest = left; } if (right < n && numbers[right] < numbers[largest]) { largest = right; } if (largest != i) { //uncomment the following line to see details in output //cout<<"Swapping "<< numbers[i]<< " and "<<numbers[largest]<<endl; swap(numbers[i], numbers[largest]); heapify(numbers, n, largest); } } void heapSort(int numbers[], int n) { for (int i = n/2 - 1; i >= 0; i--) { heapify(numbers, n, i); //uncomment the following line to see details in output //cout<<"Heapify:\t"; //display(numbers,n); } for (int i = n - 1; i >= 0; i--) { swap(numbers[0], numbers[i]); heapify(numbers, i, 0); } } int main() { int numbers[] = { 10,5, 7, 9, 4, 11, 45, 17, 60}; int size = sizeof(numbers) / sizeof(numbers[0]); cout<<"Initial Array:\t"; display(numbers,size); heapSort(numbers, size); cout<<"Sorted Array (descending order):\t"; display(numbers, size); }
lรคhtรถ:
Initial Array: 10 5 7 9 4 11 45 17 60 Sorted Array (descending order): 60 45 17 11 10 9 7 5 4
Esimerkki kekolajittelusta Code in Python
def display(arr): for i in range(len(arr)): print(arr[i], end = "\t") print() def heapify(numbers, n, i): largest = i left = 2 * i + 1 right = 2 * i + 2 if left < n and numbers[left] < numbers[largest]: largest = left if right < n and numbers[right] < numbers[largest]: largest = right if largest != i: numbers[i], numbers[largest] = numbers[largest], numbers[i] heapify(numbers, n, largest) def heapSort(items, n): for i in range(n //2,-1,-1): heapify(items, n, i) for i in range(n - 1, -1, -1): items[0], items[i] = items[i], items[0] heapify(items, i, 0) numbers = [10, 5, 7, 9, 4, 11, 45, 17, 60] print("Initial List:\t", end = "") display(numbers) print("After HeapSort:\t", end = "") heapSort(numbers, len(numbers)) display(numbers)
lรคhtรถ:
Initial List: 10 5 7 9 4 11 45 17 60 After HeapSort: 60 45 17 11 10 9 7 5 4
Keon lajittelun aika ja tila monimutkaisuusanalyysi
Voimme analysoida keon lajittelua varten aika- ja tilamonimutkaisuutta. Ajan monimutkaisuuden vuoksi meillรค on seuraavat tapaukset:
- Paras tapaus
- Keskimรครคrรคinen kotelo
- Pahimmassa tapauksessa
Keko toteutetaan tรคydellisessรค binรครคripuussa. Joten binรครคripuun alimmalla tasolla on suurin mรครคrรค solmuja. Jos alimmalla tasolla on n solmua, niin yllรค olevalla tasolla on n/2 solmua.
Tรคssรค esimerkissรค tasolla 3 on neljรค kohdetta, tasolla 2 on kaksi kohdetta ja tasolla 1 on yksi kohde. Jos kohteita on yhteensรค n, korkeus tai kokonaistaso on Kirjaudu2(n). Joten yhden elementin lisรครคminen voi kestรครค enintรครคn Log(n) iteraatioita.
Kun haluamme ottaa kasan maksimiarvon, otamme vain juurisolmun. Suorita sitten taas heapify. Jokainen kasapaino kestรครค Kirjaudu2(N) aika. Esim.tracMaksimin saavuttaminen vie O(1) aikaa.
Paras tapaus-ajan monimutkaisuus keon lajittelualgoritmille
Kun kaikki elementit on jo lajiteltu taulukossa, keon rakentaminen kestรครค O(n) aikaa. Koska jos luettelo on lajiteltu, kohteen lisรครคminen vie vakioajan, joka on O(1).
Eli max-keon tai min-keon luominen kestรครค parhaassa tapauksessa O(n) aikaa.
Keskimรครคrรคinen tapausajan monimutkaisuus keon lajittelualgoritmille
Kohteen tai esimerkin lisรครคminentracMaksimin asettaminen maksaa O(log(n)) aikaa. Joten kekolajittelualgoritmin keskimรครคrรคinen tapauskohtainen aikakompleksisuus on O(n log(n)).
Huonoin tapauksen aika monimutkaisuus keon lajittelualgoritmille
Keskimรครคrรคisen tapauksen tapaan, pahimmassa tapauksessa saatamme tehdรค kasaan n kertaa. Jokainen pinoaminen maksaa O(log(n)) aikaa. Joten, pahimman tapauksen aika monimutkaisuus on O(n log(n)).
Tilan monimutkaisuus keon lajittelualgoritmille
Keon lajittelu on paikallaan suunniteltu algoritmi. Tรคmรค tarkoittaa, ettรค tehtรคvรคn suorittamiseen ei tarvita ylimรครคrรคistรค tai vรคliaikaista muistia. Jos nรคemme toteutuksen, huomaamme, ettรค kรคytimme vaihtoa () solmujen vaihdon suorittamiseen. Muuta listaa tai taulukkoa ei tarvittu. Joten avaruuden kompleksisuus on O(1).














