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: