logo

Kaudzes kārtošanas algoritms

Šajā rakstā mēs apspriedīsim Heapsort algoritmu. Kaudzes kārtošana apstrādā elementus, izveidojot min-heap vai max-heap, izmantojot dotā masīva elementus. Min-heap vai max-heap apzīmē masīva secību, kurā saknes elements apzīmē masīva minimālo vai maksimālo elementu.

Kaudzes kārtošana būtībā rekursīvi veic divas galvenās darbības -

  • Izveidojiet kaudzi H, izmantojot masīva elementus.
  • Atkārtoti dzēsiet 1. veidā izveidotās kaudzes saknes elementustfāze.

Pirms uzzināt vairāk par kaudzes kārtošanu, vispirms apskatīsim īsu aprakstu Kaudze.

Kas ir kaudze?

Kaudze ir pilnīgs binārais koks, un binārais koks ir koks, kurā mezglam var būt maksimāli divi bērni. Pilnīgs binārais koks ir binārs koks, kurā visi līmeņi, izņemot pēdējo līmeni, t.i., lapas mezglu, ir pilnībā jāaizpilda, un visi mezgli ir jāpamato ar kreiso pusi.

Kas ir kaudzes šķirošana?

Heapsort ir populārs un efektīvs šķirošanas algoritms. Kaudzes kārtošanas jēdziens ir vienu pēc otra izņemt elementus no saraksta kaudzes daļas un pēc tam ievietot tos sakārtotajā saraksta daļā.

Heapsort ir kārtošanas algoritms vietā.

vba

Tagad apskatīsim kaudzes kārtošanas algoritmu.

Algoritms

 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 

Kaudzes kārtošanas algoritma darbība

Tagad apskatīsim Heapsort algoritma darbību.

Kaudzes kārtošanā būtībā elementu šķirošanā ir iesaistītas divas fāzes. Izmantojot kaudzes kārtošanas algoritmu, tie ir šādi:

  • Pirmais solis ietver kaudzes izveidi, pielāgojot masīva elementus.
  • Pēc kaudzes izveides tagad atkārtoti noņemiet kaudzes saknes elementu, pārvietojot to uz masīva beigām, un pēc tam saglabājiet kaudzes struktūru ar atlikušajiem elementiem.

Tagad aplūkosim kaudzes kārtošanas darbību, izmantojot piemēru. Lai to saprastu skaidrāk, ņemsim nešķirotu masīvu un mēģināsim to kārtot, izmantojot kaudzes kārtošanu. Tas padarīs skaidrojumu skaidrāku un vienkāršāku.

Kaudzes kārtošanas algoritms

Pirmkārt, mums ir jākonstruē kaudze no dotā masīva un jāpārveido par maksimālo kaudzi.

Kaudzes kārtošanas algoritms

Pēc dotās kaudzes konvertēšanas par maksimālo kaudzi, masīva elementi ir -

Kaudzes kārtošanas algoritms

Tālāk mums ir jāizdzēš saknes elements (89) no maksimālās kaudzes. Lai dzēstu šo mezglu, tas ir jāmaina ar pēdējo mezglu, t.i. (vienpadsmit). Pēc saknes elementa dzēšanas mums tas atkal ir jāveido kaudzītē, lai to pārvērstu par maksimālo kaudzi.

Kaudzes kārtošanas algoritms

Pēc masīva elementa nomaiņas 89 ar vienpadsmit, un pārvēršot kaudzi par maksimālo kaudzi, masīva elementi ir -

Kaudzes kārtošanas algoritms

Nākamajā solī mums atkal ir jāizdzēš saknes elements (81) no maksimālās kaudzes. Lai dzēstu šo mezglu, tas ir jāmaina ar pēdējo mezglu, t.i. (54). Pēc saknes elementa dzēšanas mums tas atkal ir jāveido kaudzītē, lai to pārvērstu par maksimālo kaudzi.

Kaudzes kārtošanas algoritms

Pēc masīva elementa nomaiņas 81 ar 54 un pārvēršot kaudzi par maksimālo kaudzi, masīva elementi ir -

Kaudzes kārtošanas algoritms

Nākamajā darbībā mums ir jāizdzēš saknes elements (76) atkal no max kaudzes. Lai dzēstu šo mezglu, tas ir jāmaina ar pēdējo mezglu, t.i. (9). Pēc saknes elementa dzēšanas mums tas atkal ir jāveido kaudzītē, lai to pārvērstu par maksimālo kaudzi.

Kaudzes kārtošanas algoritms

Pēc masīva elementa nomaiņas 76 ar 9 un pārvēršot kaudzi par maksimālo kaudzi, masīva elementi ir -

fmovies Indija
Kaudzes kārtošanas algoritms

Nākamajā solī mums atkal ir jāizdzēš saknes elements (54) no maksimālās kaudzes. Lai dzēstu šo mezglu, tas ir jāmaina ar pēdējo mezglu, t.i. (14). Pēc saknes elementa dzēšanas mums tas atkal ir jāveido kaudzītē, lai to pārvērstu par maksimālo kaudzi.

Kaudzes kārtošanas algoritms

Pēc masīva elementa nomaiņas 54 ar 14 un pārvēršot kaudzi par maksimālo kaudzi, masīva elementi ir -

Kaudzes kārtošanas algoritms

Nākamajā solī mums atkal ir jāizdzēš saknes elements (22) no maksimālās kaudzes. Lai dzēstu šo mezglu, tas ir jāmaina ar pēdējo mezglu, t.i. (vienpadsmit). Pēc saknes elementa dzēšanas mums tas atkal ir jāveido kaudzītē, lai to pārvērstu par maksimālo kaudzi.

Kaudzes kārtošanas algoritms

Pēc masīva elementa nomaiņas 22 ar vienpadsmit un pārvēršot kaudzi par maksimālo kaudzi, masīva elementi ir -

Kaudzes kārtošanas algoritms

Nākamajā solī mums atkal ir jāizdzēš saknes elements (14) no maksimālās kaudzes. Lai dzēstu šo mezglu, tas ir jāmaina ar pēdējo mezglu, t.i. (9). Pēc saknes elementa dzēšanas mums tas atkal ir jāveido kaudzītē, lai to pārvērstu par maksimālo kaudzi.

Kaudzes kārtošanas algoritms

Pēc masīva elementa nomaiņas 14 ar 9 un pārvēršot kaudzi par maksimālo kaudzi, masīva elementi ir -

Kaudzes kārtošanas algoritms

Nākamajā solī mums atkal ir jāizdzēš saknes elements (vienpadsmit) no maksimālās kaudzes. Lai dzēstu šo mezglu, tas ir jāmaina ar pēdējo mezglu, t.i. (9). Pēc saknes elementa dzēšanas mums tas atkal ir jāveido kaudzītē, lai to pārvērstu par maksimālo kaudzi.

Kaudzes kārtošanas algoritms

Pēc masīva elementa nomaiņas vienpadsmit ar 9, masīva elementi ir -

Kaudzes kārtošanas algoritms

Tagad kaudzītei ir palicis tikai viens elements. Pēc tā dzēšanas kaudze būs tukša.

Kaudzes kārtošanas algoritms

Pēc kārtošanas pabeigšanas masīva elementi ir -

Kaudzes kārtošanas algoritms

Tagad masīvs ir pilnībā sakārtots.

Kaudzes kārtošanas sarežģītība

Tagad apskatīsim Heap kārtošanas laika sarežģītību labākajā, vidējā un sliktākajā gadījumā. Mēs redzēsim arī Heapsort kosmosa sarežģītību.

1. Laika sarežģītība

Lieta Laika sarežģītība
Labākais gadījums O(n log)
Vidējais gadījums O(n log n)
Sliktākajā gadījumā O(n log n)
    Labākā gadījuma sarežģītība —Tas notiek, ja nav nepieciešama šķirošana, t.i., masīvs jau ir sakārtots. Labākā kaudzes kārtošanas laika sarežģītība ir O(n log). Vidējā gadījuma sarežģītība —Tas notiek, ja masīva elementi ir sajauktā secībā, kas nav pareizi augoša un nepareizi dilstoša. Vidējā kaudzes kārtošanas gadījuma laika sarežģītība ir O(n log n). Sliktākā gadījuma sarežģītība -Tas notiek, ja masīva elementi ir jākārto apgrieztā secībā. Tas nozīmē, ka jums ir jākārto masīva elementi augošā secībā, bet tā elementi ir dilstošā secībā. Sliktākā kaudzes kārtošanas laika sarežģītība ir O(n log n).

Kaudzes kārtošanas laika sarežģītība ir O(n log) visos trīs gadījumos (labākajā gadījumā, vidējais gadījums un sliktākais gadījums). Pilna bināra koka augstums ar n elementiem ir mierīgs.

2. Telpas sarežģītība

Kosmosa sarežģītība O(1)
Stabils N0
  • Kaudzes kārtošanas telpas sarežģītība ir O(1).

Heapsort ieviešana

Tagad apskatīsim Heap programmu šķirošanu dažādās programmēšanas valodās.

Programma: Uzrakstiet programmu kaudzes kārtošanai C valodā.

 #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;>