heap sort c with examples
Uvod v razvrščanje kopice s primeri.
Heapsort je ena najučinkovitejših tehnik sortiranja. Ta tehnika gradi kup iz danega nerazvrščenega polja in nato kup spet uporabi za razvrščanje polja.
Heapsort je tehnika razvrščanja, ki temelji na primerjavi in uporablja binarni kup.
=> Preberite serijo Easy C ++ Training Series.
vprašanja in odgovori za preskušanje soapui
Kaj se boste naučili:
- Kaj je binarni kup?
- Splošni algoritem
- Ilustracija
- Primer C ++
- Primer Java
- Zaključek
- Priporočeno branje
Kaj je binarni kup?
Binarni kup je predstavljen s pomočjo celotnega binarnega drevesa. Popolno binarno drevo je binarno drevo, v katerem so vsa vozlišča na vsaki ravni popolnoma zapolnjena, razen vozlišč listov in vozlišč so levo oddaljena.
Binarni kup ali preprosto kup je celotno binarno drevo, kjer so predmeti ali vozlišča shranjeni tako, da je korensko vozlišče večje od svojih dveh podrejenih vozlišč. Temu pravimo tudi največja kopica.
Elemente v binarni kopici lahko shranite tudi kot min-heap, kjer je korensko vozlišče manjše od svojih dveh podrejenih vozlišč. Kup lahko predstavljamo kot binarno drevo ali matriko.
Medtem ko predstavlja kup kot matriko, ob predpostavki, da se indeks začne z 0, je korenski element shranjen na 0. Na splošno je, če je nadrejeno vozlišče na položaju I, levo podrejeno vozlišče na položaju (2 * I + 1) in desno vozlišče je pri (2 * I +2).
Splošni algoritem
Spodaj je splošen algoritem za tehniko razvrščanja kopice.
- Iz danih podatkov zgradite največ kup, tako da je koren najvišji element kupa.
- Odstranite koren, torej najvišji element s kupa, in ga zamenjajte ali zamenjajte z zadnjim elementom kupa.
- Nato prilagodite največji kup, da ne kršite lastnosti največjega kopičenja (heapify).
- Zgornji korak zmanjša velikost kupa za 1.
- Zgornje tri korake ponavljajte, dokler se velikost kupa ne zmanjša na 1.
Kot je prikazano v splošnem algoritmu za razvrščanje danega nabora podatkov v naraščajočem vrstnem redu, najprej zgradimo največ kup za dane podatke.
Vzemimo primer za izdelavo največje kopice z naslednjim naborom podatkov.
6, 10, 2, 4, 1
Za ta nabor podatkov lahko sestavimo drevo na naslednji način.
V zgornji predstavitvi drevesa številke v oklepajih predstavljajo ustrezne položaje v matriki.
Če želimo zgraditi največ kup zgornje predstavitve, moramo izpolniti pogoj kopice, da mora biti nadrejeno vozlišče večje od njegovih podrejenih vozlišč. Z drugimi besedami, drevo moramo 'zgostiti', da ga pretvorimo v največjo kopico.
Po zgoščevanju zgornjega drevesa bomo dobili največji kup, kot je prikazano spodaj.
Kot je prikazano zgoraj, imamo ta največji kup, ustvarjen iz polja.
Nato predstavimo ponazoritev vrste kup. Po ogledu gradnje max-heap-a bomo preskočili podrobne korake za izdelavo max-heap-a in na vsakem koraku bomo neposredno prikazali max-heap.
Ilustracija
Upoštevajte naslednjo paleto elementov. To matriko moramo razvrstiti s tehniko razvrščanja kopice.
Sestavimo maks-kup, kot je prikazano spodaj, za razvrščanje polja.
Ko je kup sestavljen, ga predstavimo v obliki matrike, kot je prikazano spodaj.
Zdaj primerjamo 1stvozlišče (root) z zadnjim vozliščem in jih nato zamenjajte. Tako, kot je prikazano zgoraj, zamenjamo 17 in 3, tako da je 17 na zadnjem položaju in 3 na prvem mestu.
Zdaj odstranimo vozlišče 17 iz kupa in ga postavimo v razvrščeno polje, kot je prikazano v osenčenem delu spodaj.
Zdaj spet sestavimo kup elementov matrike. Tokrat se velikost kopice zmanjša za 1, saj smo iz kupa izbrisali en element (17).
Kup preostalih elementov je prikazan spodaj.
V naslednjem koraku bomo ponovili iste korake.
Primerjamo in zamenjamo korenski element in zadnji element na kopici.
Po zamenjavi izbrišemo element 12 iz kupa in ga premaknemo v razvrščeno polje.
Še enkrat sestavimo največ kup za preostale elemente, kot je prikazano spodaj.
Zdaj zamenjamo koren in zadnji element, tj. 9 in 3. Po zamenjavi se element 9 izbriše iz kupa in vstavi razvrščeno polje.
V tem trenutku imamo na kupu le tri elemente, kot je prikazano spodaj.
razredi naslovov ip in maska podomrežja
Zamenjamo 6 in 3 ter iz kupa izbrišemo element 6 in ga dodamo v razvrščeno polje.
Zdaj sestavimo kup preostalih elementov in nato oba zamenjamo med seboj.
Po zamenjavi 4 in 3 iz kupa izbrišemo element 4 in ga dodamo v razvrščeno polje. Zdaj imamo na kupu le eno vozlišče, kot je prikazano spodaj .
Zdaj, ko je ostalo samo še eno vozlišče, ga izbrišemo s kopice in dodamo v razvrščeno polje.
Tako je zgoraj prikazano razvrščeno polje, ki smo ga dobili kot rezultat razvrščanja kopice.
Na zgornji sliki smo matriko razvrstili v naraščajočem vrstnem redu. Če moramo matriko razvrstiti po padajočem vrstnem redu, moramo slediti istim korakom, vendar z min-kupom.
kako poslati ddos napad -
Algoritam Heapsort je enak izbirnemu razvrščanju, pri katerem izberemo najmanjši element in ga umestimo v razvrščeno polje. Razvrščanje kopice pa je glede na uspešnost hitrejše od izbranega. Lahko rečemo, da je kupček izboljšana različica vrste izbire.
Nato bomo implementirali Heapsort v jeziku C ++ in Java.
Najpomembnejša funkcija v obeh izvedbah je funkcija 'heapify'. To funkcijo pokliče glavna rutina razvrščanja, da prerazporedi poddrevo, ko je vozlišče izbrisano ali ko je zgrajen maks.
Ko bomo drevo pravilno zgostili, bomo šele takrat lahko dobili pravilne elemente v ustreznih položajih in tako bo matrika pravilno razvrščena.
Primer C ++
Sledi koda C ++ za implementacijo displeja.
#include using namespace std; // function to heapify the tree void heapify(int arr(), int n, int root) { int largest = root; // root is the largest element int l = 2*root + 1; // left = 2*root + 1 int r = 2*root + 2; // right = 2*root + 2 // If left child is larger than root if (l arr(largest)) largest = l; // If right child is larger than largest so far if (r arr(largest)) largest = r; // If largest is not root if (largest != root) { //swap root and largest swap(arr(root), arr(largest)); // Recursively heapify the sub-tree heapify(arr, n, largest); } } // implementing heap sort void heapSort(int arr(), int n) { // build heap for (int i = n / 2 - 1; i >= 0; i--) heapify(arr, n, i); // extracting elements from heap one by one for (int i=n-1; i>=0; i--) { // Move current root to end swap(arr(0), arr(i)); // again call max heapify on the reduced heap heapify(arr, i, 0); } } /* print contents of array - utility function */ void displayArray(int arr(), int n) { for (int i=0; i Izhod:
Vhodno polje
4 17 3 12 9 6
Razvrščeno polje
3 4 6 9 12 17
Nato bomo izvedli vrvico v jeziku Java
Primer Java
// Java program to implement Heap Sort class HeapSort { public void heap_sort(int arr()) { int n = arr.length; // Build heap (rearrange array) for (int i = n / 2 - 1; i >= 0; i--) heapify(arr, n, i); // One by one extract an element from heap for (int i=n-1; i>=0; i--) { // Move current root to end int temp = arr(0); arr(0) = arr(i); arr(i) = temp; // call max heapify on the reduced heap heapify(arr, i, 0); } } // heapify the sub-tree void heapify(int arr(), int n, int root) { int largest = root; // Initialize largest as root int l = 2*root + 1; // left = 2*root + 1 int r = 2*root + 2; // right = 2*root + 2 // If left child is larger than root if (l arr(largest)) largest = l; // If right child is larger than largest so far if (r arr(largest)) largest = r; // If largest is not root if (largest != root) { int swap = arr(root); arr(root) = arr(largest); arr(largest) = swap; // Recursively heapify the affected sub-tree heapify(arr, n, largest); } } //print array contents - utility function static void displayArray(int arr()) { int n = arr.length; for (int i=0; i Izhod:
Vhodna matrika:
4 17 3 12 9 6
Razvrščeno polje:
3 4 6 9 12 17
Zaključek
Heapsort je tehnika razvrščanja na osnovi primerjave z uporabo binarne kopice.
Lahko ga označimo kot izboljšanje v primerjavi z razvrščanjem, saj obe tehniki razvrščanja delujeta s podobno logiko večkratnega iskanja največjega ali najmanjšega elementa v matriki in nato namestitve v razvrščeno polje.
Razvrščanje kopice za razvrščanje polja uporablja max-heap ali min-heap. Prvi korak pri razvrščanju kopice je zgraditi najmanjši ali največji kup iz podatkov matrike, nato rekurzivno izbrisati korenski element in kopičiti kup, dokler ni na kupu le eno vozlišče.
Heapsort je učinkovit algoritem in deluje hitreje kot izbirno razvrščanje. Uporablja se lahko za razvrščanje skoraj razvrščene matrike ali iskanje k največjih ali najmanjših elementov v matriki.
S tem smo zaključili temo o tehnikah razvrščanja v jeziku C ++. Od naše naslednje vadbe naprej bomo začeli s podatkovnimi strukturami eno za drugo.
=> Poiščite celotno serijo usposabljanj za C ++ tukaj.
Priporočeno branje
- Metoda sortiranja () MongoDB () s primeri
- Ukaz za razvrščanje Unix s sintakso, možnostmi in primeri
- Združi razvrstitev v jeziku C ++ s primeri
- Razvrstitev lupine v C ++ z primeri
- Razvrstitev vstavka v C ++ z primeri
- Izbirno razvrščanje v C ++ z primeri
- Razvrstitev mehurčkov v jeziku C ++ s primeri
- Hitro razvrščanje v jeziku C ++ s primeri