logo

Algoritmus řazení haldy

V tomto článku budeme diskutovat o algoritmu Heapsort. Řazení haldy zpracuje prvky tak, že vytvoří min-heap nebo max-heap pomocí prvků daného pole. Min-heap nebo max-heap představuje uspořádání pole, ve kterém kořenový prvek představuje minimální nebo maximální prvek pole.

Řazení haldy v podstatě rekurzivně provádí dvě hlavní operace -

  • Sestavte haldu H pomocí prvků pole.
  • Opakovaně odstraňte kořenový prvek haldy vytvořené v 1Svatýfáze.

Než se dozvíme více o třídění haldy, podívejme se nejprve na stručný popis Halda.

Co je to hromada?

Halda je úplný binární strom a binární strom je strom, ve kterém může mít uzel maximálně dva potomky. Úplný binární strom je binární strom, ve kterém by všechny úrovně kromě poslední úrovně, tj. listového uzlu, měly být zcela vyplněny a všechny uzly by měly být zarovnány doleva.

Co je haldové řazení?

Heapsort je populární a efektivní třídicí algoritmus. Koncept řazení haldy je odstranit prvky jeden po druhém z části haldy seznamu a poté je vložit do seřazené části seznamu.

Heapsort je místní třídicí algoritmus.

Herec Rekha

Nyní se podívejme na algoritmus řazení haldy.

Algoritmus

 HeapSort(arr) BuildMaxHeap(arr) for i = length(arr) to 2 swap arr[1] with arr[i] heap_size[arr] = heap_size[arr] ? 1 MaxHeapify(arr,1) End 

BuildMaxHeap(arr)

 BuildMaxHeap(arr) heap_size(arr) = length(arr) for i = length(arr)/2 to 1 MaxHeapify(arr,i) End 

MaxHeapify(arr,i)

 MaxHeapify(arr,i) L = left(i) R = right(i) if L ? heap_size[arr] and arr[L] > arr[i] largest = L else largest = i if R ? heap_size[arr] and arr[R] > arr[largest] largest = R if largest != i swap arr[i] with arr[largest] MaxHeapify(arr,largest) End 

Fungování algoritmu řazení haldy

Nyní se podívejme, jak funguje Heapsort Algorithm.

Při třídění haldy v zásadě existují dvě fáze, které se účastní třídění prvků. Při použití algoritmu řazení haldy jsou následující -

  • První krok zahrnuje vytvoření haldy úpravou prvků pole.
  • Po vytvoření haldy nyní odeberte kořenový prvek haldy opakovaně tak, že jej posunete na konec pole, a poté uložte strukturu haldy se zbývajícími elementy.

Nyní se podívejme na fungování třídění haldy podrobně na příkladu. Abychom tomu porozuměli jasněji, vezměme nesetříděné pole a zkusme ho seřadit pomocí řazení haldy. Vysvětlování bude jasnější a jednodušší.

Algoritmus řazení haldy

Nejprve musíme z daného pole sestavit haldu a převést ji na maximální haldu.

Algoritmus řazení haldy

Po převedení dané haldy na maximální haldu jsou prvky pole -

Algoritmus řazení haldy

Dále musíme odstranit kořenový prvek (89) z maximální hromady. Abychom tento uzel smazali, musíme jej prohodit s posledním uzlem, tzn. (jedenáct). Po smazání kořenového prvku jej musíme znovu nahromadit, abychom jej převedli na maximální haldu.

Algoritmus řazení haldy

Po výměně prvku pole 89 s jedenáct, a převedením haldy na maximální haldu jsou prvky pole -

Algoritmus řazení haldy

V dalším kroku opět musíme odstranit kořenový prvek (81) z maximální hromady. Abychom tento uzel smazali, musíme jej prohodit s posledním uzlem, tzn. (54). Po smazání kořenového prvku jej musíme znovu nahromadit, abychom jej převedli na maximální haldu.

Algoritmus řazení haldy

Po výměně prvku pole 81 s 54 a převedením haldy na maximální haldu jsou prvky pole -

Algoritmus řazení haldy

V dalším kroku musíme odstranit kořenový prvek (76) opět z maximální hromady. Abychom tento uzel smazali, musíme jej prohodit s posledním uzlem, tzn. (9). Po smazání kořenového prvku jej musíme znovu nahromadit, abychom jej převedli na maximální haldu.

Algoritmus řazení haldy

Po výměně prvku pole 76 s 9 a převedením haldy na maximální haldu jsou prvky pole -

Algoritmus řazení haldy

V dalším kroku opět musíme odstranit kořenový prvek (54) z maximální hromady. Abychom tento uzel smazali, musíme jej prohodit s posledním uzlem, tzn. (14). Po smazání kořenového prvku jej musíme znovu nahromadit, abychom jej převedli na maximální haldu.

spát v js
Algoritmus řazení haldy

Po výměně prvku pole 54 s 14 a převedením haldy na maximální haldu jsou prvky pole -

Algoritmus řazení haldy

V dalším kroku opět musíme odstranit kořenový prvek (22) z maximální hromady. Abychom tento uzel smazali, musíme jej prohodit s posledním uzlem, tzn. (jedenáct). Po smazání kořenového prvku jej musíme znovu nahromadit, abychom jej převedli na maximální haldu.

Algoritmus řazení haldy

Po výměně prvku pole 22 s jedenáct a převedením haldy na maximální haldu jsou prvky pole -

Algoritmus řazení haldy

V dalším kroku opět musíme odstranit kořenový prvek (14) z maximální hromady. Abychom tento uzel smazali, musíme jej prohodit s posledním uzlem, tzn. (9). Po smazání kořenového prvku jej musíme znovu nahromadit, abychom jej převedli na maximální haldu.

Algoritmus řazení haldy

Po výměně prvku pole 14 s 9 a převedením haldy na maximální haldu jsou prvky pole -

Algoritmus řazení haldy

V dalším kroku opět musíme odstranit kořenový prvek (jedenáct) z maximální hromady. Abychom tento uzel smazali, musíme jej prohodit s posledním uzlem, tzn. (9). Po smazání kořenového prvku jej musíme znovu nahromadit, abychom jej převedli na maximální haldu.

Algoritmus řazení haldy

Po výměně prvku pole jedenáct s 9, prvky pole jsou -

Algoritmus řazení haldy

Nyní hromadě zbývá pouze jeden prvek. Po smazání bude halda prázdná.

Algoritmus řazení haldy

Po dokončení řazení jsou prvky pole -

Algoritmus řazení haldy

Nyní je pole kompletně seřazeno.

Složitost řazení haldy

Nyní se podívejme na časovou složitost řazení Heap v nejlepším případě, průměrném případě a nejhorším případě. Uvidíme také vesmírnou složitost Heapsortu.

1. Časová složitost

Pouzdro Časová složitost
Nejlepší případ O(n log)
Průměrný případ O(n log n)
Nejhorší případ O(n log n)
    Nejlepší složitost případu –Nastane, když není vyžadováno žádné třídění, tj. pole je již seřazeno. Nejlepší případ časové složitosti řazení haldy je O(n log). Průměrná složitost případu –Vyskytuje se, když jsou prvky pole v neuspořádaném pořadí, které není správně vzestupné a není správně sestupné. Průměrná časová složitost třídění haldy je O(n log n). Složitost nejhoršího případu -Nastává, když je požadováno, aby prvky pole byly seřazeny v opačném pořadí. To znamená, že musíte seřadit prvky pole ve vzestupném pořadí, ale jeho prvky jsou v sestupném pořadí. Nejhorší případ časové složitosti řazení haldy je O(n log n).

Časová složitost řazení haldy je O(n log) ve všech třech případech (nejlepší případ, průměrný případ a nejhorší případ). Výška úplného binárního stromu s n prvky je uklidnit.

2. Prostorová složitost

Vesmírná složitost O(1)
Stabilní N0
  • Prostorová složitost řazení haldy je O(1).

Implementace Heapsort

Nyní se podívejme na programy řazení Heap v různých programovacích jazycích.

Program: Napište program pro implementaci řazení haldy v jazyce C.

 #include /* function to heapify a subtree. Here &apos;i&apos; is the index of root node in array a[], and &apos;n&apos; is the size of heap. */ void heapify(int a[], int n, int i) { int largest = i; // Initialize largest as root int left = 2 * i + 1; // left child int right = 2 * i + 2; // right child // If left child is larger than root if (left a[largest]) largest = left; // If right child is larger than root if (right a[largest]) largest = right; // If root is not largest if (largest != i) { // swap a[i] with a[largest] int temp = a[i]; a[i] = a[largest]; a[largest] = temp; heapify(a, n, largest); } } /*Function to implement the heap sort*/ void heapSort(int a[], int n) { for (int i = n / 2 - 1; i &gt;= 0; i--) heapify(a, n, i); // One by one extract an element from heap for (int i = n - 1; i &gt;= 0; i--) { /* Move current root element to end*/ // swap a[0] with a[i] int temp = a[0]; a[0] = a[i]; a[i] = temp; heapify(a, i, 0); } } /* function to print the array elements */ void printArr(int arr[], int n) { for (int i = 0; i <n; ++i) { printf('%d', arr[i]); printf(' '); } int main() a[]="{48," 10, 23, 43, 28, 26, 1}; n="sizeof(a)" sizeof(a[0]); printf('before sorting array elements are - 
'); printarr(a, n); heapsort(a, printf('
after return 0; < pre> <p> <strong>Output</strong> </p> <img src="//techcodeview.com/img/ds-tutorial/50/heap-sort-algorithm-20.webp" alt="Heap Sort Algorithm"> <p> <strong>Program:</strong> Write a program to implement heap sort in C++.</p> <pre> #include using namespace std; /* function to heapify a subtree. Here &apos;i&apos; is the index of root node in array a[], and &apos;n&apos; is the size of heap. */ void heapify(int a[], int n, int i) { int largest = i; // Initialize largest as root int left = 2 * i + 1; // left child int right = 2 * i + 2; // right child // If left child is larger than root if (left a[largest]) largest = left; // If right child is larger than root if (right a[largest]) largest = right; // If root is not largest if (largest != i) { // swap a[i] with a[largest] int temp = a[i]; a[i] = a[largest]; a[largest] = temp; heapify(a, n, largest); } } /*Function to implement the heap sort*/ void heapSort(int a[], int n) { for (int i = n / 2 - 1; i &gt;= 0; i--) heapify(a, n, i); // One by one extract an element from heap for (int i = n - 1; i &gt;= 0; i--) { /* Move current root element to end*/ // swap a[0] with a[i] int temp = a[0]; a[0] = a[i]; a[i] = temp; heapify(a, i, 0); } } /* function to print the array elements */ void printArr(int a[], int n) { for (int i = 0; i <n; ++i) { cout< <a[i]<<' '; } int main() a[]="{47," 9, 22, 42, 27, 25, 0}; n="sizeof(a)" sizeof(a[0]); cout<<'before sorting array elements are - 
'; printarr(a, n); heapsort(a, cout<<'
after return 0; < pre> <p> <strong>Output</strong> </p> <img src="//techcodeview.com/img/ds-tutorial/50/heap-sort-algorithm-21.webp" alt="Heap Sort Algorithm"> <p> <strong>Program:</strong> Write a program to implement heap sort in C#.</p> <pre> using System; class HeapSort { /* function to heapify a subtree. Here &apos;i&apos; is the index of root node in array a[], and &apos;n&apos; is the size of heap. */ static void heapify(int[] a, int n, int i) { int largest = i; // Initialize largest as root int left = 2 * i + 1; // left child int right = 2 * i + 2; // right child // If left child is larger than root if (left a[largest]) largest = left; // If right child is larger than root if (right a[largest]) largest = right; // If root is not largest if (largest != i) { // swap a[i] with a[largest] int temp = a[i]; a[i] = a[largest]; a[largest] = temp; heapify(a, n, largest); } } /*Function to implement the heap sort*/ static void heapSort(int[] a, int n) { for (int i = n / 2 - 1; i &gt;= 0; i--) heapify(a, n, i); // One by one extract an element from heap for (int i = n - 1; i &gt;= 0; i--) { /* Move current root element to end*/ // swap a[0] with a[i] int temp = a[0]; a[0] = a[i]; a[i] = temp; heapify(a, i, 0); } } /* function to print the array elements */ static void printArr(int[] a, int n) { for (int i = 0; i <n; ++i) console.write(a[i] + ' '); } static void main() { int[] a="{46," 8, 21, 41, 26, 24, -1}; int n="a.Length;" console.write('before sorting array elements are - 
'); printarr(a, n); heapsort(a, console.write('
after < pre> <p> <strong>Output</strong> </p> <img src="//techcodeview.com/img/ds-tutorial/50/heap-sort-algorithm-22.webp" alt="Heap Sort Algorithm"> <p> <strong>Program:</strong> Write a program to implement heap sort in Java.</p> <pre> class HeapSort { /* function to heapify a subtree. Here &apos;i&apos; is the index of root node in array a[], and &apos;n&apos; is the size of heap. */ static void heapify(int a[], int n, int i) { int largest = i; // Initialize largest as root int left = 2 * i + 1; // left child int right = 2 * i + 2; // right child // If left child is larger than root if (left a[largest]) largest = left; // If right child is larger than root if (right a[largest]) largest = right; // If root is not largest if (largest != i) { // swap a[i] with a[largest] int temp = a[i]; a[i] = a[largest]; a[largest] = temp; heapify(a, n, largest); } } /*Function to implement the heap sort*/ static void heapSort(int a[], int n) { for (int i = n / 2 - 1; i &gt;= 0; i--) heapify(a, n, i); // One by one extract an element from heap for (int i = n - 1; i &gt;= 0; i--) { /* Move current root element to end*/ // swap a[0] with a[i] int temp = a[0]; a[0] = a[i]; a[i] = temp; heapify(a, i, 0); } } /* function to print the array elements */ static void printArr(int a[], int n) { for (int i = 0; i <n; ++i) system.out.print(a[i] + ' '); } public static void main(string args[]) { int a[]="{45," 7, 20, 40, 25, 23, -2}; n="a.length;" system.out.print('before sorting array elements are - 
'); printarr(a, n); heapsort(a, system.out.print('
after < pre> <p> <strong>Output</strong> </p> <img src="//techcodeview.com/img/ds-tutorial/50/heap-sort-algorithm-23.webp" alt="Heap Sort Algorithm"> <p>So, that&apos;s all about the article. Hope the article will be helpful and informative to you.</p> <hr></n;></pre></n;></pre></n;></pre></n;>