Heap Sort-algoritme (med Code in Python og C++)

โšก Smart oppsummering

Sorteringsalgoritme for heaper sorterer en matrise ved รฅ bygge en binรฆr heap og gjentatte ganger utfรธretraclegger rotverdien inn i den sorterte delen. Denne ressursen forklarer heapify, max og min heaps, pseudokode og complete Python og C++ implementeringer med tidskompleksitetsanalyse.

  • ???? Kjerneide: Heapsortering bygger en komplett binรฆr heap, og utfรธrer deretter gjentatte gangertracts roten for รฅ produsere en sortert rekkefรธlge.
  • ๐Ÿ”บ Heapify: Heapify-operasjonen gjenoppretter heap-egenskapen ved รฅ bytteping en forelder med sitt stรธrre barn.
  • ๐Ÿ—ƒ๏ธ Array-lagring: En heap lagres i en array der en node ved indeks i har barn ved 2i+1 og 2i+2.
  • ๏ธ kompleksitet: Heapsortering kjรธrer i O(n log n) tid i alle tilfeller og bruker O(1) ekstra plass.
  • ๐Ÿ’ป Code Sรธrget for: Arbeide Python og C++ Programmer demonstrerer heapify, heap-bygging og full sortering.

Hva er Heap Sort Algorithm?

Heap Sort er en av de populรฆre og raskere sorteringsalgoritmene. Den er bygget pรฅ den komplette binรฆrtre-datastrukturen. Vi sรธker etter det stรธrste elementet og plasserer det รธverst for den stรธrste heapen. Vi plasserer det pรฅ den overordnede noden til det binรฆre treet.

La oss si at en matrise er gitt, data = [10,5, 7, 9, 4, 11, 45, 17, 60].

I matrisen, hvis i-th (i=0,1,2,3 โ€ฆ) indeks er en overordnet node, vil (2i+1) og (2i+2) vรฆre venstre og hรธyre barn. ร… lage et komplett binรฆrt tre med denne matrisen vil se slik ut:

Algoritme for haugsortering

Vi vil gjรธre heapify-prosessen fra begynnelsen til slutten av matrisen. Til รฅ begynne med, hvis vi konverterer matrisen til et tre, vil den se ut som ovenfor. Vi kan se at den ikke opprettholder noen heap-egenskap (min-heap eller max-heap). Vi vil fรฅ den sorterte matrisen ved รฅ gjรธre heapify-prosessen for alle nodene.

Anvendelse av Heap Sort

Her er litt bruk av heap-sorteringsalgoritmen:

  • Konstruksjon av "Prioritetskรธer" trenger massevis. Fordi heapsort holder elementet sortert etter hver innsetting.
  • Heap Data Structure er effektiv for รฅ finne kth stรธrste element i en gitt matrise.
  • Linux Kernel bruker heap-sortering som standard sorteringsalgoritme ettersom den har O (1) romkompleksitet.

Lag haugsortering med eksempel

Her vil vi konstruere en maksimal haug fra fรธlgende komplette binรฆre tre.

Lag haugsortering med eksempel

Bladnodene er 17, 60, 4, 11 og 45. De har ingen underordnede noder. Det er derfor de er bladnoder. Sรฅ vi starter heapify-metoden fra deres overordnede node. Her er trinnene:

Trinn 1) Velg undertreet lengst til venstre. Hvis undernodene er stรธrre, bytt den overordnede noden med den underordnede noden.

Her er foreldrenoden 9. Og undernodene er 17 og 60. Ettersom 60 er den stรธrste, vil 60 og 9 bli byttet for รฅ opprettholde maks haug.

Lag haugsortering med eksempel

Trinn 2) Nรฅ er undertreet lengst til venstre heapified. Den neste overordnede noden er 7. Denne forelderen har to underordnede noder, og den stรธrste er 45. Sรฅ 45 og 7 vil bli byttet.

Lag haugsortering med eksempel

Lag haugsortering med eksempel

Trinn 3) Nodene 60 og 4 har overordnet node 5. Ettersom "5" er mindre enn den underordnede noden 60, vil den bli byttet.

Lag haugsortering med eksempel

Lag haugsortering med eksempel

Trinn 4) Nรฅ har node 5 den underordnede noden 17,9. Dette opprettholder ikke egenskapen for maksimal haug. Sรฅ 5 vil bli erstattet med 17.

Lag haugsortering med eksempel

Trinn 5) Node 10 vil bli byttet med 60, deretter byttet med 17. Prosessen vil se slik ut.

Lag haugsortering med eksempel

Lag haugsortering med eksempel

Trinn 6) Frem til trinn 5 opprettet vi den maksimale haugen. Hver overordnet node er stรธrre enn dens underordnede noder. Rotnoden har maksimumsverdien (60).

OBS: For รฅ lage den sorterte matrisen, mรฅ vi erstatte den maksimalt verdsatte noden med dens etterfรธlger.

Denne prosessen kalles "extract maks". Siden 60 er maks-noden, vil vi fikse posisjonen til den 0. indeksen og lage haugen uten node 60.

Lag haugsortering med eksempel

Lag haugsortering med eksempel

Trinn 7) Nรฅr 60 fjernes, er den neste maksimumsverdien 45. Vi vil utfรธre prosessen ยซEks.tract Maxโ€ igjen fra node 45.

Denne gangen fรฅr vi 45 og erstatter rotnoden med etterfรธlgeren 17.

Vi mรฅ prestere"Extract Maksโ€ til alle elementene er sortert.

Etter รฅ ha gjort disse trinnene til vi ekstracHvis vi bruker alle maksverdiene, fรฅr vi fรธlgende matrise.

Lag haugsortering med eksempel

Hva er Binary Heap?

En binรฆr haug er en slags komplett binรฆrt tre datastruktur. I denne typen trestruktur er overordnet node enten stรธrre eller mindre enn undernodene. Hvis foreldrenoden er mindre, kalles haugen "Min Heap", og hvis foreldrenoden er stรธrre, kalles haugen "Max Heap".

Her er eksempler pรฅ min haug og maks haug.

Min Heap og Max Heap
Min Heap og Max Heap

I figuren ovenfor, hvis du legger merke til "Min Heap", er den overordnede noden alltid mindre enn dens underordnede noder. Pรฅ toppen av treet kan vi finne den minste verdien 10.

Pรฅ samme mรฅte, for "Max Heap", er overordnet node alltid stรธrre enn undernodene. Det maksimale elementet er tilstede ved hodenoden for "Max Heap".

Hva er "Heapify"?

"Heapify" er prinsippet for heapen som sikrer posisjonen til noden. I Heapify opprettholder en maks haug alltid et forhold til foreldre og barn, og det vil si at overordnet node vil vรฆre stรธrre enn undernodene.

Hvis for eksempel en ny node legges til, mรฅ vi endre formen pรฅ heapen. Det kan imidlertid hende vi mรฅ endre eller bytte ut nodene eller omorganisere arrayet. Denne prosessen med omformingping En heap kalles ยซheapifyยป.

Her er et eksempel pรฅ hvordan heapify fungerer:

Legge til en ny node og Heapify
Legger til en ny node og heapify

Her er trinnene for heapify:

Trinn 1) Lagt til node 65 som hรธyre underordnet av node 60.

Trinn 2) Sjekk om den nylig lagt til noden er stรธrre enn den overordnede.

Trinn 3) Siden den er stรธrre enn foreldrenoden, byttet vi det riktige barnet med dets overordnede.

Hvordan bygge haugen

Fรธr vi bygger haugen eller heapify et tre, mรฅ vi vite hvordan vi skal lagre den. Siden haugen er et komplett binรฆrt tre, er det bedre รฅ bruke en matrise รฅ holde dataene til haugen.

La oss si at en matrise inneholder totalt n elementer. Hvis "i" indeks er en overordnet node, vil venstre node vรฆre pรฅ indeks (2i+1), og den hรธyre noden vil vรฆre ved indeks (2i+2). Vi antar at array-indeksen begynner fra 0.

Ved รฅ bruke dette, la oss lagre en maks haug til en array-lignende fรธlgende:

Array-basert representasjon av Max Heap
Array-basert representasjon av den maksimale heapen

Heapify-algoritmen opprettholder heap-egenskapen. Hvis forelderen ikke har ekstremverdien (mindre eller stรธrre), vil den bli byttet med den mest ekstreme barnenoden.

Her er trinnene for รฅ heapify en maks haug:

Trinn 1) Start fra bladnoden.

Trinn 2) Finn maksimum mellom foreldre og barn.

Trinn 3) Bytt nodene hvis den underordnede noden har en stรธrre verdi enn den overordnede.

Trinn 4) Gรฅ ett nivรฅ opp.

Trinn 5) Fรธlg trinn 2,3,4 til vi nรฅr indeks 0 eller sorter hele treet.

Her er pseudokoden for rekursiv heapify (maks 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)

Kallenavn Code for heapsortering

Her er pseudokoden for heap-sorteringsalgoritmen:

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)

Eksempel pรฅ heap-sortering 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);
}

Utgang:

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

Eksempel pรฅ heap-sortering 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)

Utgang:

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

Tid og rom kompleksitetsanalyse av Heap Sort

Det er tidskompleksitet og romkompleksitet som vi kan analysere for haugsorten. For tidskompleksitet har vi fรธlgende tilfeller:

  1. Beste sak
  2. Gjennomsnittlig sak
  3. Verste tilfelle

Heapen er implementert pรฅ et komplett binรฆrt tre. Sรฅ, pรฅ bunnnivรฅet av det binรฆre treet, vil det vรฆre maksimalt antall noder. Hvis det nederste nivรฅet har n noder, vil nivรฅet ovenfor ha n/2 noder.

Tid og rom kompleksitetsanalyse

I dette eksemplet har nivรฅ 3 fire elementer, nivรฅ 2 har to elementer, og nivรฅ 1 har ett element. Hvis det er totalt n antall elementer, vil hรธyden eller totalnivรฅet vรฆre Overnatting2(n). Sรฅ รฅ sette inn et enkelt element kan ta maksimalt Log(n) iterasjoner.

Nรฅr vi vil ta maksimalverdien fra haugen, tar vi bare rotnoden. Sรฅ igjen, kjรธr heapify. Hver heapify tar Overnatting2(N) tid. Eks.tracDet tar O(1) tid รฅ nรฅ maksimumet.

Best case-tidskompleksitet for heap-sorteringsalgoritme

Nรฅr alle elementene allerede er sortert i matrisen, vil det ta O(n) tid รฅ bygge haugen. Fordi hvis listen er sortert, vil det รฅ sette inn et element ta den konstante tiden som er O(1).

Sรฅ det vil ta O(n) tid รฅ lage en max-heap eller min-heap i beste fall.

Gjennomsnittlig sakstidskompleksitet for haugsorteringsalgoritme

Sette inn en vare eller et eksempeltracรฅ bestemme maksimale kostnader O(log(n)) tid. Sรฅ den gjennomsnittlige tidskompleksiteten for heap-sorteringsalgoritmen er O(n log(n)).

Worst Case Time Complexity for Heap Sort Algorithm

I likhet med gjennomsnittlig tilfelle, i verste fall, kan vi utfรธre heapify n ganger. Hver heapify vil koste O(log(n)) tid. Sรฅ, den verste tid kompleksiteten vil vรฆre O(n log(n)).

Space Complexity for Heap Sort Algorithm

Heap sort er en algoritme som er designet pรฅ stedet. Dette betyr at det ikke trengs noe ekstra eller midlertidig minne for รฅ utfรธre oppgaven. Hvis vi ser implementeringen, vil vi legge merke til at vi brukte swap () for รฅ utfรธre utvekslingen av nodene. Ingen annen liste eller matrise var nรธdvendig. Sรฅ romkompleksiteten er O(1).

Spรธrsmรฅl og svar

Heapsortering er ikke en stabil sorteringsalgoritme, fordi bygging og eks.tracร… hente fra heapen kan endre rekkefรธlgen pรฅ like elementer. Hvis det er viktig รฅ bevare den opprinnelige rekkefรธlgen av like nรธkler, er en stabil algoritme som merge sorter et bedre valg.

Heapsortering garanterer O(n log n) tid i alle tilfeller og bruker O(1) ekstra plass. Hurtigsortering er vanligvis raskere i praksis, men kan degraderes til O(nยฒ ved dรฅrlige pivoter. Heapsortering bytter litt hastighet mot et pรฅlitelig verst tenkelig tilfelle.

Bรฅde heap-sortering og merge-sortering kjรธrer i O(n log n) tid. Heap-sortering sorterer pรฅ plass med O(1) ekstra plass, men er ustabil. Merge-sortering er stabil, men trenger O(n) ekstra plass for merge.

AI-veiledere kan animere heapify-prosessen, vise hvordan den maksimale heapen dannes, og trace hver ekstract-maks-trinn. Denne visuelle, interaktive hjelpen gjรธr det enklere for nybegynnere รฅ forstรฅ hvordan heap-sortering ordner en matrise.

Ja. AI-kodingsassistenter kan oversette en heapsorteringsimplementering mellom sprรฅk som C++, Pythonog Java mens keeping logikken er intakt. Du bรธr fortsatt kompilere og teste den konverterte koden for รฅ bekrefte riktig utdata.

Oppsummer dette innlegget med: