Heap Sort-algoritm (med Code in Python och C++)

โšก Smart sammanfattning

Heapsorteringsalgoritmen sorterar en array genom att bygga en binรคr heap och upprepade gรฅnger extracoch lรคgger in dess rotvรคrde i den sorterade sektionen. Den hรคr resursen fรถrklarar heapify, max- och min-heaps, pseudokod och complete. Python och C++ implementeringar med tidskomplexitetsanalys.

  • ???? Kรคrnidรฉ: Heapsortering bygger en komplett binรคr heap och exkluderar sedan upprepade gรฅngertracts roten fรถr att producera en sorterad ordning.
  • ๐Ÿ”บ Heapify: Heapify-operationen รฅterstรคller heap-egenskapen genom swapping en fรถrรคlder med sitt stรถrre barn.
  • ๐Ÿ—ƒ๏ธ Arraylagring: En heap lagras i en array dรคr en nod vid index i har barn vid 2i+1 och 2i+2.
  • โฑ๏ธ Komplexitet: Heapsortering kรถrs i O(n log n) tid i alla fall och anvรคnder O(1) extra utrymme.
  • ๐Ÿ’ป Code Fรถrsedd: Arbeta Python och C++ Program demonstrerar heapify, heap-byggande och fullstรคndig sortering.

Vad รคr Heap Sort Algorithm?

Heap Sort รคr en av de populรคra och snabbare sorteringsalgoritmerna. Den รคr byggd pรฅ den kompletta binรคra trรคdstrukturen. Vi kommer att sรถka efter det maximala elementet och placera det hรถgst upp fรถr den maximala heapen. Vi kommer att placera det pรฅ den รถverordnade noden i det binรคra trรคdet.

Lรฅt oss sรคga att en array ges, data = [10,5, 7, 9, 4, 11, 45, 17, 60].

I arrayen, om i-th (i=0,1,2,3 โ€ฆ) index รคr en รถverordnad nod sรฅ kommer (2i+1) och (2i+2) att vara vรคnster och hรถger barn. Att skapa ett komplett binรคrt trรคd med denna array kommer att se ut sรฅ hรคr:

Hรถgsorteringsalgoritm

Vi kommer att gรถra heapify-processen frรฅn bรถrjan till slutet av arrayen. Till en bรถrjan, om vi konverterar arrayen till ett trรคd, kommer den att se ut som ovan. Vi kan se att det inte upprรคtthรฅller nรฅgon heap-egenskap (min-heap eller max heap). Vi kommer att fรฅ den sorterade arrayen genom att gรถra heapify-processen fรถr alla noder.

Tillรคmpning av Heap Sort

Hรคr รคr lite anvรคndning av heap-sorteringsalgoritmen:

  • Konstruktion av "prioriterade kรถer" behรถver sorteras i hรถgar. Eftersom heapsort hรฅller elementet sorterat efter varje insรคttning gรถrs.
  • Heap Data Structure รคr effektiv fรถr att hitta kth stรถrsta elementet i en given array.
  • Linux Kernel anvรคnder hรถgsorteringen som standard sorteringsalgoritm eftersom det har O (1) rymdkomplexitet.

Skapa hรถgsortering med exempel

Hรคr kommer vi att konstruera en maxhรถg frรฅn fรถljande kompletta binรคra trรคd.

Skapa hรถgsortering med exempel

Bladnoderna รคr 17, 60, 4, 11 och 45. De har inga barnnoder. Det รคr dรคrfรถr de รคr lรถvnoder. Sรฅ vi kommer att starta heapify-metoden frรฅn deras รถverordnade nod. Hรคr รคr stegen:

Steg 1) Vรคlj undertrรคdet lรคngst till vรคnster. Om de underordnade noderna รคr stรถrre, byt ut den รถverordnade noden med den underordnade noden.

Hรคr รคr fรถrรคldernoden 9. Och de underordnade noderna รคr 17 och 60. Eftersom 60 รคr den stรถrsta kommer 60 och 9 att bytas ut fรถr att bibehรฅlla max hรถg.

Skapa hรถgsortering med exempel

Steg 2) Nu รคr undertrรคdet lรคngst till vรคnster hรถgt upp. Nรคsta fรถrรคldernod รคr 7. Denna fรถrรคlder har tvรฅ underordnade noder, och den stรถrsta รคr 45. Sรฅ 45 och 7 kommer att bytas.

Skapa hรถgsortering med exempel

Skapa hรถgsortering med exempel

Steg 3) Noderna 60 och 4 har fรถrรคldranoden 5. Eftersom "5" รคr mindre รคn den underordnade noden 60 kommer den att bytas.

Skapa hรถgsortering med exempel

Skapa hรถgsortering med exempel

Steg 4) Nu har nod 5 den underordnade noden 17,9. Detta bibehรฅller inte egenskapen max heap. Sรฅ 5 kommer att ersรคttas med 17.

Skapa hรถgsortering med exempel

Steg 5) Nod 10 kommer att bytas ut med 60 och sedan bytas ut mot 17. Processen kommer att se ut som fรถljande.

Skapa hรถgsortering med exempel

Skapa hรถgsortering med exempel

Steg 6) Fram till steg 5 skapade vi maxhรถgen. Varje fรถrรคldernod รคr stรถrre รคn dess underordnade noder. Rotnoden har maxvรคrdet (60).

Obs: Fรถr att skapa den sorterade arrayen mรฅste vi ersรคtta den maxvรคrdade noden med dess efterfรถljare.

Denna process kallas "extract-maxโ€. Eftersom 60 รคr maxnoden fixar vi dess position till det 0:e indexet och skapar hรถgen utan nod 60.

Skapa hรถgsortering med exempel

Skapa hรถgsortering med exempel

Steg 7) Nรคr 60 tas bort blir nรคsta maximala vรคrde 45. Vi utfรถr processen "Ex.tract Maxโ€ igen frรฅn nod 45.

Den hรคr gรฅngen fรฅr vi 45 och ersรคtter rotnoden med dess efterfรถljare 17.

Vi mรฅste prestera"Extract Maxโ€ tills alla element รคr sorterade.

Efter att ha gjort dessa steg tills vi extracMed alla maxvรคrden fรฅr vi fรถljande array.

Skapa hรถgsortering med exempel

Vad รคr Binary Heap?

En binรคr hรถg รคr ett slags komplett binรคrt trรคd datastruktur. I denna typ av trรคdstruktur รคr fรถrรคldernoden antingen stรถrre eller mindre รคn undernoderna. Om fรถrรคldernoden รคr mindre kallas hรถgen "Min Heap" och om fรถrรคldernoden รคr stรถrre kallas hรถgen fรถr "Max Heap".

Hรคr รคr exempel pรฅ min heap och max heap.

Min Heap och Max Heap
Min Heap och Max Heap

I figuren ovan, om du mรคrker "Min Heap", รคr fรถrรคldernoden alltid mindre รคn dess underordnade noder. I toppen av trรคdet kan vi hitta det minsta vรคrdet 10.

Pรฅ samma sรคtt, fรถr "Max Heap", รคr den รถverordnade noden alltid stรถrre รคn de underordnade noderna. Det maximala elementet finns vid huvudnoden fรถr "Max Heap".

Vad รคr "Heapify"?

"Heapify" รคr principen fรถr heapen som sรคkerstรคller nodens position. I Heapify upprรคtthรฅller en maxhรถg alltid en relation med fรถrรคlder och barn, och det รคr att fรถrรคldernoden kommer att vara stรถrre รคn undernoderna.

Om till exempel en ny nod lรคggs till mรฅste vi omforma heapen. Vi kan dock behรถva รคndra eller byta ut noderna eller ordna om arrayen. Denna process av omformningping en heap kallas "heapify".

Hรคr รคr ett exempel pรฅ hur heapify fungerar:

Lรคgga till en ny nod och Heapify
Lรคgger till en ny nod och heapify

Hรคr รคr stegen fรถr heapify:

Steg 1) Lade till nod 65 som rรคtt underordnad till nod 60.

Steg 2) Kontrollera om den nyligen tillagda noden รคr stรถrre รคn den รถverordnade.

Steg 3) Eftersom den รคr stรถrre รคn fรถrรคldernoden bytte vi rรคtt barn med dess fรถrรคlder.

Hur man bygger hรถgen

Innan vi bygger hรถgen eller fรถrhรถjer ett trรคd mรฅste vi veta hur vi ska lagra det. Eftersom hรถgen รคr ett komplett binรคrt trรคd, รคr det bรคttre att anvรคnda en array fรถr att hรฅlla data frรฅn hรถgen.

Lรฅt oss sรคga att en array innehรฅller totalt n element. Om "i":e index รคr en รถverordnad nod, kommer den vรคnstra noden att vara vid index (2i+1), och den hรถgra noden kommer att vara vid index (2i+2). Vi antar att arrayindexet bรถrjar frรฅn 0.

Med detta, lรฅt oss lagra en maxhรถg till en array-liknande fรถljande:

Array-baserad representation av Max Heap
Matrisbaserad representation av maxhรถgen

Heapify-algoritmen upprรคtthรฅller heap-egenskapen. Om fรถrรคldern inte har det extrema vรคrdet (mindre eller stรถrre), kommer det att bytas ut mot den mest extrema barnnoden.

Hรคr รคr stegen fรถr att heapify en maxhรถg:

Steg 1) Bรถrja frรฅn lรถvnoden.

Steg 2) Hitta det maximala mellan fรถrรคlder och barn.

Steg 3) Byt noderna om den underordnade noden har ett stรถrre vรคrde รคn den รถverordnade.

Steg 4) Gรฅ en nivรฅ upp.

Steg 5) Fรถlj steg 2,3,4 tills vi nรฅr index 0 eller sortera hela trรคdet.

Hรคr รคr pseudokoden fรถr rekursiv 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)

Pseudo Code fรถr hรถgsortering

Hรคr รคr pseudokoden fรถr 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)

Exempel pรฅ heapsortering 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);
}

Produktion:

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

Exempel pรฅ heapsortering 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)

Produktion:

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

Tid och rumskomplexitetsanalys av Heap Sort

Det finns tidskomplexitet och rymdkomplexitet som vi kan analysera fรถr hรถgen. Fรถr tidskomplexitet har vi fรถljande fall:

  1. Bรคsta fall
  2. Genomsnittligt fall
  3. Vรคrsta fall

Hรถgen รคr implementerad pรฅ ett komplett binรคrt trรคd. Sรฅ pรฅ den nedre nivรฅn av det binรคra trรคdet kommer det att finnas det maximala antalet noder. Om bottennivรฅn har n noder, kommer nivรฅn ovan att ha n/2 noder.

Tid och rums komplexitetsanalys

I det hรคr exemplet har nivรฅ 3 fyra fรถremรฅl, nivรฅ 2 har tvรฅ fรถremรฅl och nivรฅ 1 har ett fรถremรฅl. Om det finns totalt n antal objekt kommer hรถjden eller totalnivรฅn att vara Logga2(n). Sรฅ att infoga ett enda element kan ta maximalt med Log(n) iterationer.

Nรคr vi vill ta maxvรคrdet frรฅn hรถgen tar vi bara rotnoden. Sedan igen, kรถr heapify. Varje heapify tar Logga2(N) tid. Ex.tracAtt nรฅ maximum tar O(1) tid.

Bรคsta fall tidskomplexitet fรถr Heap Sort Algorithm

Nรคr alla element redan รคr sorterade i arrayen kommer det att ta O(n) tid att bygga hรถgen. Fรถr om listan รคr sorterad kommer att infoga ett objekt ta den konstanta tiden som รคr O(1).

Sรฅ det kommer att ta O(n) tid att skapa en max-hรถg eller min-hรถg i bรคsta fall.

Genomsnittlig falltidskomplexitet fรถr heapsorteringsalgoritm

Sรคtta in ett objekt eller exempeltracatt berรคkna en maximal kostnad O(log(n)) tid. Sรฅ den genomsnittliga tidskomplexiteten fรถr heapsorteringsalgoritmen รคr O(n log(n)).

Worst Case Time Complexity for Heap Sort Algorithm

I likhet med det genomsnittliga fallet, i det vรคrsta scenariot, skulle vi kunna utfรถra heapify n gรฅnger. Varje heapify kommer att kosta O(log(n)) tid. Sรฅ den vรคrsta tidskomplexiteten kommer att vara O(n log(n)).

Space Complexity for Heap Sort Algorithm

Heap sort รคr en platsdesignad algoritm. Detta innebรคr att inget extra eller tillfรคlligt minne behรถvs fรถr att utfรถra uppgiften. Om vi โ€‹โ€‹ser implementeringen kommer vi att mรคrka att vi anvรคnde swap () fรถr att utfรถra utbytet av noderna. Ingen annan lista eller array behรถvdes. Sรฅ rymdkomplexiteten รคr O(1).

Vanliga frรฅgor

Heapsortering รคr inte en stabil sorteringsalgoritm, eftersom byggande och extracAtt hรคmta frรฅn heapen kan รคndra ordningen pรฅ lika element. Om det รคr viktigt att bevara den ursprungliga ordningen av lika nycklar รคr en stabil algoritm som merge sorter ett bรคttre val.

Heapsortering garanterar O(n log n) tid i alla fall och anvรคnder O(1) extra utrymme. Snabbsortering รคr vanligtvis snabbare i praktiken men kan degraderas till O(nยฒ) vid dรฅliga pivoter. Heapsortering byter ut viss hastighet mot ett pรฅlitligt vรคrsta tรคnkbara scenario.

Bรฅde heapsortering och mergesortering kรถrs i O(n log n) tid. Heapsortering sorterar pรฅ plats med O(1) extra utrymme men รคr instabil. Mergesortering รคr stabil men behรถver O(n) extra utrymme fรถr merge.

AI-handledare kan animera heapify-processen, visa hur den maximala heapen bildas och trace varje extract-max-steg. Denna visuella, interaktiva hjรคlp gรถr det enklare fรถr nybรถrjare att fรถrstรฅ hur heapsortering ordnar en array.

Ja. AI-kodningsassistenter kan รถversรคtta en heapsorteringsimplementering mellan sprรฅk som C++, Pythonoch Java medan keeping logiken intakt. Du bรถr fortfarande kompilera och testa den konverterade koden fรถr att bekrรคfta korrekt utdata.

Sammanfatta detta inlรคgg med: