Algoritam sortiranja hrpe (s Code in Python i C++)

โšก Pametni saลพetak

Algoritam sortiranja hrpe sortira niz izgradnjom binarne hrpe i ponovljenim izvrลกavanjem.tracubacivanjem njegove korijenske vrijednosti u sortirani odjeljak. Ovaj resurs objaลกnjava heapify, max i min heaps, pseudokod i complete Python i C++ implementacije s analizom vremenske sloลพenosti.

  • ???? Osnovna ideja: Heap sortiranje gradi kompletnu binarnu heap, a zatim viลกe puta extracts korijen kako bi se dobio sortirani poredak.
  • ๐Ÿ”บ Heapify: Operacija heapify vraฤ‡a svojstvo heapa pomoฤ‡u swap-a.ping roditelj sa svojim veฤ‡im djetetom.
  • ๐Ÿ—ƒ๏ธ Pohrana niza: Heap je pohranjen u nizu gdje ฤvor na indeksu i ima djecu na 2i+1 i 2i+2.
  • ๐Ÿ‡ง๐Ÿ‡ท Sloลพenost: Heap sortiranje se u svim sluฤajevima izvrลกava za O(n log n) vremena i koristi O(1) dodatnog prostora.
  • ๐Ÿ’ป Code pod uvjetom da: Rad Python i C++ Programi demonstriraju heapify, izgradnju heapa i potpuno sortiranje.

ล to je algoritam Heap Sort?

Heap sortiranje je jedan od popularnih i brลพih algoritama za sortiranje. Izgraฤ‘en je na potpunoj strukturi podataka binarnog stabla. Traลพit ฤ‡emo maksimalni element i staviti ga na vrh maksimalne hrpe. Stavit ฤ‡emo ga na roditeljski ฤvor binarnog stabla.

Recimo da je dan niz, podaci = [10,5, 7, 9, 4, 11, 45, 17, 60].

U nizu, ako je i-ti (i=0,1,2,3 โ€ฆ) indeks nadreฤ‘eni ฤvor tada ฤ‡e (2i+1) i (2i+2) biti lijevi i desni potomci. Stvaranje potpunog binarnog stabla s ovim nizom izgledat ฤ‡e ovako:

Algoritam za sortiranje hrpe

Napravit ฤ‡emo heapify proces od poฤetka do kraja niza. U poฤetku, ako pretvorimo niz u stablo, izgledat ฤ‡e kao gore. Vidimo da ne odrลพava nikakvo svojstvo hrpe (min-hop ili maksimalna hrpa). Dobit ฤ‡emo razvrstani niz izvoฤ‘enjem heapify procesa za sve ฤvorove.

Primjena Heap sortiranja

Evo neke upotrebe algoritma za sortiranje hrpe:

  • Konstrukcija "prioritetnih redova" zahtijeva sortiranje hrpe. Buduฤ‡i da heapsort odrลพava element sortiranim nakon svakog umetanja.
  • Heap Data Structure uฤinkovita je u pronalaลพenju kth najveฤ‡i element u datom nizu.
  • Linux kernel koristi heap sortiranje kao zadano algoritam sortiranja buduฤ‡i da ima O (1) prostornu sloลพenost.

Stvorite Heap sortiranje s primjerom

Ovdje ฤ‡emo konstruirati max heap iz sljedeฤ‡eg kompletnog binarnog stabla.

Stvorite Heap sortiranje s primjerom

ฤŒvorovi lista su 17, 60, 4, 11 i 45. Nemaju ฤvorove potomke. Zato su lisni ฤvorovi. Dakle, pokrenut ฤ‡emo heapify metodu iz njihovog nadreฤ‘enog ฤvora. Evo koraka:

Korak 1) Odaberite krajnje lijevo podstablo. Ako su podreฤ‘eni ฤvorovi veฤ‡i, zamijenite roditeljski ฤvor s podreฤ‘enim ฤvorom.

Ovdje je roditeljski ฤvor 9. A podreฤ‘eni ฤvorovi su 17 i 60. Buduฤ‡i da je 60 najveฤ‡i, 60 i 9 ฤ‡e se zamijeniti kako bi se odrลพao max gomila.

Stvorite Heap sortiranje s primjerom

Korak 2) Sada je krajnje lijevo podstablo gomilano. Sljedeฤ‡i nadreฤ‘eni ฤvor je 7. Ovaj roditelj ima dva podreฤ‘ena ฤvora, a najveฤ‡i je 45. Dakle, 45 i 7 ฤ‡e biti zamijenjeni.

Stvorite Heap sortiranje s primjerom

Stvorite Heap sortiranje s primjerom

Korak 3) ฤŒvorovi 60 i 4 imaju nadreฤ‘eni ฤvor 5. Kako je "5" manji od podreฤ‘enog ฤvora 60, bit ฤ‡e zamijenjen.

Stvorite Heap sortiranje s primjerom

Stvorite Heap sortiranje s primjerom

Korak 4) Sada, ฤvor 5 ima podreฤ‘eni ฤvor 17,9. Ovo ne odrลพava svojstvo maksimalne hrpe. Dakle, 5 ฤ‡e biti zamijenjeno sa 17.

Stvorite Heap sortiranje s primjerom

Korak 5) ฤŒvor 10 bit ฤ‡e zamijenjen s 60, zatim s 17. Proces ฤ‡e izgledati ovako.

Stvorite Heap sortiranje s primjerom

Stvorite Heap sortiranje s primjerom

Korak 6) Do koraka 5 stvorili smo maksimalnu hrpu. Svaki nadreฤ‘eni ฤvor je veฤ‡i od svojih podreฤ‘enih ฤvorova. Korijenski ฤvor ima najveฤ‡u vrijednost (60).

Biljeลกka: Da bismo stvorili sortirani niz, trebamo zamijeniti ฤvor s maksimalnom vrijednoลกฤ‡u njegovim nasljednikom.

Ovaj proces se naziva "extract maxโ€. Kako je 60 maksimalni ฤvor, fiksirati ฤ‡emo njegovu poziciju na 0. indeks i kreirati gomilu bez ฤvora 60.

Stvorite Heap sortiranje s primjerom

Stvorite Heap sortiranje s primjerom

Korak 7) Kako se uklanja 60, sljedeฤ‡a maksimalna vrijednost je 45. Izvrลกit ฤ‡emo postupak โ€œExtract Maxโ€ ponovno iz ฤvora 45.

Ovaj put ฤ‡emo dobiti 45 i zamijeniti korijenski ฤvor s njegovim nasljednikom 17.

Moramo izvesti"Extract-maks.โ€ dok se svi elementi ne posloลพe.

Nakon ลกto izvrลกimo ove korake dok ne zavrลกimotract svih maksimalnih vrijednosti, dobit ฤ‡emo sljedeฤ‡i niz.

Stvorite Heap sortiranje s primjerom

ล to je binarna gomila?

Binarna gomila je neka vrsta potpune binarno stablo struktura podataka. U ovoj vrsti strukture stabla, nadreฤ‘eni ฤvor je veฤ‡i ili manji od podreฤ‘enih ฤvorova. Ako je nadreฤ‘eni ฤvor manji, hrpa se naziva "Minimalna hrpa", a ako je nadreฤ‘eni ฤvor veฤ‡i, hrpa se naziva "Maksimalna hrpa".

Evo primjera minimalne hrpe i maksimalne hrpe.

Min. hrpa i maks. hrpa
Min. hrpa i maks. hrpa

Na gornjoj slici, ako primijetite "Min Heap", nadreฤ‘eni ฤvor uvijek je manji od svojih podreฤ‘enih ฤvorova. Na ฤelu stabla moลพemo pronaฤ‡i najmanju vrijednost 10.

Sliฤno, za "Max Heap", nadreฤ‘eni ฤvor uvijek je veฤ‡i od podreฤ‘enih ฤvorova. Maksimalni element prisutan je u glavnom ฤvoru za "Max Heap".

ล to je โ€œHeapifyโ€?

โ€œHeapifyโ€ je princip gomile koji osigurava poziciju ฤvora. U Heapifyju maksimalna gomila uvijek odrลพava odnos s roditeljem i dijetetom, a to je da ฤ‡e roditeljski ฤvor biti veฤ‡i od podreฤ‘enih ฤvorova.

Na primjer, ako se doda novi ฤvor, moramo preoblikovati hrpu. Meฤ‘utim, moลพda ฤ‡emo morati promijeniti ili zamijeniti ฤvorove ili preurediti niz. Ovaj proces preoblikovanjaping hrpa se naziva โ€žheapifyโ€œ.

Evo primjera kako heapify funkcionira:

Dodavanje novog ฤvora i Heapify
Dodavanje novog ฤvora i heapifyja

Evo koraka za heapify:

Korak 1) Dodan je ฤvor 65 kao desni potomak ฤvora 60.

Korak 2) Provjerite je li novododani ฤvor veฤ‡i od nadreฤ‘enog.

Korak 3) Buduฤ‡i da je veฤ‡i od roditeljskog ฤvora, zamijenili smo pravo dijete s njegovim roditeljem.

Kako izgraditi Heap

Prije izgradnje gomile ili gomilanja stabla, moramo znati kako ฤ‡emo ga skladiลกtiti. Kako je gomila potpuno binarno stablo, bolje je koristiti an poredak za drลพanje podataka hrpe.

Recimo da niz sadrลพi ukupno n elemenata. Ako je โ€œiโ€ indeks nadreฤ‘eni ฤvor, onda ฤ‡e lijevi ฤvor biti na indeksu (2i+1), a desni ฤvor ฤ‡e biti na indeksu (2i+2). Pretpostavljamo da indeks niza poฤinje od 0.

Koristeฤ‡i ovo, pohranimo maksimalnu hrpu u niz nalik sljedeฤ‡em:

Predstavljanje maksimalne hrpe temeljeno na nizu
Predstavljanje maksimalne gomile temeljeno na nizu

Heapify algoritam odrลพava heap svojstvo. Ako roditelj nema ekstremnu vrijednost (manju ili veฤ‡u), zamijenit ฤ‡e se s najekstremnijim podreฤ‘enim ฤvorom.

Evo koraka za gomilanje maksimalne gomile:

Korak 1) Poฤnite od ฤvora lista.

Korak 2) Pronaฤ‘ite maksimum izmeฤ‘u roditelja i djece.

Korak 3) Zamijenite ฤvorove ako podreฤ‘eni ฤvor ima veฤ‡u vrijednost od nadreฤ‘enog.

Korak 4) Idi jednu razinu viลกe.

Korak 5) Slijedite korake 2,3,4 dok ne doฤ‘emo do indeksa 0 ili sortiramo cijelo stablo.

Evo pseudokoda za rekurzivnu heapify (max heap):

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)

Nadimak Code za sortiranje hrpe

Evo pseudokoda za algoritam za sortiranje hrpe:

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)

Primjer sortiranja hrpe 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);
}

Izlaz:

Initial Array:  10      5       7       9       4       11      45      17      60
Sorted Array (descending order):  60      45      17      11      10      9       7       5       4

Primjer sortiranja hrpe 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)

Izlaz:

Initial List:   10      5       7       9       4       11      45      17      60
After HeapSort: 60      45      17      11      10      9       7       5       4

Vremenska i prostorna analiza sloลพenosti Heap sortiranja

Postoji vremenska sloลพenost i prostorna sloลพenost koje moลพemo analizirati za sortiranje hrpe. Za vremensku sloลพenost imamo sljedeฤ‡e sluฤajeve:

  1. Najbolji sluฤaj
  2. Prosjeฤan sluฤaj
  3. Najgori sluฤaj

Hrpa je implementirana na potpunom binarnom stablu. Dakle, na donjoj razini binarnog stabla bit ฤ‡e najveฤ‡i broj ฤvorova. Ako donja razina ima n ฤvorova, tada ฤ‡e gornja razina imati n/2 ฤvora.

Analiza sloลพenosti vremena i prostora

U ovom primjeru, razina 3 ima ฤetiri stavke, razina 2 ima dvije stavke, a razina 1 ima jednu stavku. Ako postoji ukupan broj stavki n, bit ฤ‡e visina ili ukupna razina Dnevnik2(n). Dakle, umetanje jednog elementa moลพe trajati najviลกe Log(n) ponavljanja.

Kada ลพelimo uzeti maksimalnu vrijednost iz hrpe, uzimamo samo korijenski ฤvor. Zatim opet pokrenite heapify. Svaki heapify uzima Dnevnik2(N) vrijeme. ExtracDosezanje maksimuma traje O(1) vremena.

Najbolji sluฤaj vremenske sloลพenosti za algoritam Heap sortiranja

Kada su svi elementi veฤ‡ sortirani u nizu, bit ฤ‡e potrebno O(n) vremena da se izgradi hrpa. Jer ako je popis sortiran tada ฤ‡e umetanje stavke trajati konstantno vrijeme koje je O(1).

Dakle, trebat ฤ‡e O(n) vremena da se stvori max-heap ili min-heap u najboljem sluฤaju.

Prosjeฤna sloลพenost sluฤaja za algoritam sortiranja hrpe

Umetanje stavke ili extracPostavljanje maksimalnog broja sluฤajeva koลกta O(log(n)) vremena. Dakle, prosjeฤna vremenska sloลพenost sluฤaja za algoritam sortiranja hrpe je O(n log(n)).

Vremenska sloลพenost u najgorem sluฤaju za algoritam sortiranja hrpe

Sliฤno prosjeฤnom sluฤaju, u najgorem sluฤaju, mogli bismo izvrลกiti heapify n puta. Svako heapify ฤ‡e koลกtati O(log(n)) vremena. Dakle, vremenska sloลพenost u najgorem sluฤaju bit ฤ‡e O(n log(n)).

Sloลพenost prostora za algoritam sortiranja gomile

Heap sortiranje je algoritam dizajniran na mjestu. To znaฤi da za izvoฤ‘enje zadatka nije potrebna dodatna ili privremena memorija. Ako vidimo implementaciju, primijetit ฤ‡emo da smo koristili swap () za izvoฤ‘enje razmjene ฤvorova. Nikakav drugi popis ili niz nije bio potreban. Dakle, kompleksnost prostora je O(1).

Pitanja i odgovori

Heap sortiranje nije stabilan algoritam sortiranja, jer izgradnja i extracIzvlaฤenjem iz hrpe moลพete promijeniti redoslijed jednakih elemenata. Ako je vaลพno oฤuvanje izvornog redoslijeda jednakih kljuฤeva, stabilan algoritam poput sortiranja spajanjem je bolji izbor.

Heap sortiranje jamฤi O(n log n) vremena u svim sluฤajevima i koristi O(1) dodatnog prostora. Quicksort je obiฤno brลพi u praksi, ali se moลพe degradirati na O(nยฒ) na loลกim pivotima. Heap sortiranje ลพrtvuje dio brzine za pouzdan najgori sluฤaj.

I heap sort i merge sort se izvrลกavaju u vremenu O(n log n). Heap sort sort sortira na mjestu s O(1) dodatnog prostora, ali je nestabilno. Spajanje sort je stabilno, ali treba O(n) dodatnog prostora za spajanje.

AI tutori mogu animirati proces heapify-a, pokazati kako se formira maksimalna heap datoteka i tracsvaki bivลกitract-max korak. Ova vizualna, interaktivna pomoฤ‡ olakลกava poฤetnicima razumijevanje kako heap sortiranje ureฤ‘uje niz.

Da. Pomoฤ‡nici za kodiranje umjetne inteligencije mogu prevesti implementaciju sortiranja hrpe izmeฤ‘u jezika kao ลกto su C++, Pythoni Java dok keeping logika je netaknuta. I dalje biste trebali kompajlirati i testirati pretvoreni kod kako biste potvrdili ispravan izlaz.

Saลพmite ovu objavu uz: