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.

ล 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:
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.
ฤ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.
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.
Korak 3) ฤvorovi 60 i 4 imaju nadreฤeni ฤvor 5. Kako je "5" manji od podreฤenog ฤvora 60, bit ฤe zamijenjen.
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.
Korak 5) ฤvor 10 bit ฤe zamijenjen s 60, zatim s 17. Proces ฤe izgledati ovako.
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.
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.
ล 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.

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:

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:

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:
- Najbolji sluฤaj
- Prosjeฤan sluฤaj
- 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.
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).














