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.

  • ๐ŸŒณ Perusidea: Keon lajittelu muodostaa tรคydellisen binรครคrikeon ja suorittaa sitten toistuvasti ex-lausekkeentracts juurta lajitellun jรคrjestyksen luomiseksi.
  • ๐Ÿ”บ Heapify: Heapify-operaatio palauttaa heap-ominaisuuden swap-funktiollaping vanhempi isomman lapsensa kanssa.
  • ๐Ÿ—ƒ๏ธ Tallennustila: Keko tallennetaan taulukkoon, jossa indeksin i solmulla on lapsisolmuja kohdissa 2i+1 ja 2i+2.
  • โฑ๏ธ Monimutkaisuus: Keon lajittelu suoritetaan kaikissa tapauksissa ajassa O(n log n) ja kรคyttรครค O(1) ylimรครคrรคistรค tilaa.
  • ๐Ÿ’ป Code Edellyttรคen: Tyรถ Python ja C++ ohjelmat esittelevรคt heapy-operaatiota, heap building -operaatiota ja niiden tรคyttรค lajittelua.

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รค:

Heap Lajittelu Algoritmi

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.

Luo Kekolajittelu esimerkin avulla

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.

Luo Kekolajittelu esimerkin avulla

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.

Luo Kekolajittelu esimerkin avulla

Luo Kekolajittelu esimerkin avulla

Vaihe 3) Solmuilla 60 ja 4 on ylรคsolmu 5. Koska "5" on pienempi kuin alisolmu 60, se vaihdetaan.

Luo Kekolajittelu esimerkin avulla

Luo Kekolajittelu esimerkin avulla

Vaihe 4) Nyt solmulla 5 on lapsisolmu 17,9. Tรคmรค ei yllรคpidรค maksimikeon ominaisuutta. Joten 5 korvataan 17:llรค.

Luo Kekolajittelu esimerkin avulla

Vaihe 5) Solmu 10 vaihdetaan 60:een ja sitten 17:รครคn. Prosessi nรคyttรครค seuraavalta.

Luo Kekolajittelu esimerkin avulla

Luo Kekolajittelu esimerkin avulla

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.

Luo Kekolajittelu esimerkin avulla

Luo Kekolajittelu esimerkin avulla

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.

Luo Kekolajittelu esimerkin avulla

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.

Min Heap ja Max Heap
Min Heap ja Max Heap

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:

Uuden solmun lisรครคminen ja Heapify
Uuden solmun lisรครคminen ja kasaaminen

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:

Suurin kasan taulukkopohjainen esitys
Enimmรคiskeon taulukkopohjainen esitys

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:

  1. Paras tapaus
  2. Keskimรครคrรคinen kotelo
  3. 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.

Ajan ja tilan monimutkaisuusanalyysi

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).

UKK

Kekolajittelu ei ole vakaa lajittelualgoritmi, koska keon rakentaminen ja esittelytracKeosta tulevien tietojen avulla voidaan jรคrjestellรค yhtรค suuret elementit uudelleen. Jos yhtรคlรคisten avainten alkuperรคisen jรคrjestyksen sรคilyttรคminen on tรคrkeรครค, vakaa algoritmi, kuten yhdistรคvรค lajittelu, on parempi vaihtoehto.

Kekolajittelu takaa O(n log n) ajan kaikissa tapauksissa ja kรคyttรครค O(1) ylimรครคrรคistรค tilaa. Pikalajittelu on yleensรค kรคytรคnnรถssรค nopeampi, mutta se voi heikentyรค O(nยฒ):รครคn huonojen pivot-pisteiden tapauksessa. Kekolajittelu antaa hieman nopeutta luotettavan pahimman tapauksen saavuttamiseksi.

Sekรค kekolajittelu ettรค yhdistรคmislajittelu toimivat ajassa O(n log n). Kekolajittelu lajittelee paikallaan O(1) lisรคtilalla, mutta on epรคvakaa. Yhdistรคmislajittelu on vakaa, mutta tarvitsee O(n) lisรคtilaa yhdistรคmistรค varten.

Tekoรคlyohjaajat voivat animoida heapify-prosessia, nรคyttรครค, miten maksimikeo muodostuu, ja trace jokainen entinentract-max-vaihe. Tรคmรค visuaalinen ja interaktiivinen ohje auttaa aloittelijoita ymmรคrtรคmรครคn, miten kekolajittelu jรคrjestรครค taulukon.

Kyllรค. Tekoรคlykoodausavustajat voivat kรครคntรครค kekolajittelun toteutuksen eri kielten vรคlillรค, kuten C++, Pythonja Java samalla kun keeping logiikka ehjรคnรค. Sinun tulisi silti kรครคntรครค ja testata muunnettu koodi varmistaaksesi oikean tulosteen.

Tiivistรค tรคmรค viesti seuraavasti: