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.

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:
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.
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.
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.
Steg 3) Noderna 60 och 4 har fรถrรคldranoden 5. Eftersom "5" รคr mindre รคn den underordnade noden 60 kommer den att bytas.
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.
Steg 5) Nod 10 kommer att bytas ut med 60 och sedan bytas ut mot 17. Processen kommer att se ut som fรถljande.
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.
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.
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.

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:

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:

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:
- Bรคsta fall
- Genomsnittligt fall
- 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.
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).














