logo

Algorytm sortowania sterty

W tym artykule omówimy algorytm Heapsort. Sortowanie sterty przetwarza elementy, tworząc stertę minimalną lub stertę maksymalną przy użyciu elementów danej tablicy. Min-sterta lub max-heap reprezentuje kolejność tablicy, w której element główny reprezentuje minimalny lub maksymalny element tablicy.

Sortowanie sterty zasadniczo rekurencyjnie wykonuje dwie główne operacje -

  • Zbuduj stertę H, korzystając z elementów tablicy.
  • Wielokrotnie usuń element główny sterty utworzonej w 1ulfaza.

Zanim dowiemy się więcej o sortowaniu sterty, przyjrzyjmy się najpierw krótkiemu opisowi Sterta.

Co to jest kupa?

Kopiec jest kompletnym drzewem binarnym, a drzewo binarne jest drzewem, w którym węzeł może mieć maksymalnie dwoje dzieci. Kompletne drzewo binarne to drzewo binarne, w którym wszystkie poziomy z wyjątkiem ostatniego, czyli węzła liścia, powinny być całkowicie wypełnione, a wszystkie węzły powinny być wyrównane do lewej strony.

Co to jest sortowanie sterty?

Heapsort to popularny i wydajny algorytm sortowania. Koncepcja sortowania na stercie polega na eliminowaniu elementów jeden po drugim ze sterty części listy, a następnie wstawianiu ich do posortowanej części listy.

Heapsort to algorytm sortowania w miejscu.

statyczne słowo kluczowe w Javie

Przyjrzyjmy się teraz algorytmowi sortowania sterty.

Algorytm

 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 

Działanie algorytmu sortowania sterty

Przyjrzyjmy się teraz działaniu algorytmu Heapsort.

W zasadzie sortowanie na stercie obejmuje dwie fazy sortowania elementów. Używając algorytmu sortowania sterty, są one następujące:

  • Pierwszy krok obejmuje utworzenie sterty poprzez dopasowanie elementów tablicy.
  • Po utworzeniu sterty usuń teraz wielokrotnie element główny sterty, przesuwając go na koniec tablicy, a następnie zapisz strukturę sterty z pozostałymi elementami.

Przyjrzyjmy się teraz szczegółowo działaniu sortowania na stercie na przykładzie. Aby to lepiej zrozumieć, weźmy nieposortowaną tablicę i spróbujmy ją posortować za pomocą sortowania przez stertę. Dzięki temu wyjaśnienia będą jaśniejsze i łatwiejsze.

Algorytm sortowania sterty

Najpierw musimy skonstruować stertę z podanej tablicy i przekonwertować ją na maksymalną stertę.

Algorytm sortowania sterty

Po przekonwertowaniu danej sterty na maksymalną stertę elementy tablicy to -

Algorytm sortowania sterty

Następnie musimy usunąć element główny (89) z maksymalnej sterty. Aby usunąć ten węzeł, musimy zamienić go z ostatnim węzłem, tj. (jedenaście). Po usunięciu elementu głównego musimy go ponownie spakować, aby przekonwertować go na maksymalną stertę.

Algorytm sortowania sterty

Po zamianie elementu tablicy 89 z jedenaście, i konwertując stertę na maksymalną stertę, elementami tablicy są -

Algorytm sortowania sterty

W następnym kroku ponownie musimy usunąć element główny (81) z maksymalnej sterty. Aby usunąć ten węzeł, musimy zamienić go z ostatnim węzłem, tj. (54). Po usunięciu elementu głównego musimy go ponownie spakować, aby przekonwertować go na maksymalną stertę.

Algorytm sortowania sterty

Po zamianie elementu tablicy 81 z 54 i konwertując stertę na maksymalną stertę, elementami tablicy są -

Algorytm sortowania sterty

W kolejnym kroku musimy usunąć element główny (76) ponownie z maksymalnej sterty. Aby usunąć ten węzeł, musimy zamienić go z ostatnim węzłem, tj. (9). Po usunięciu elementu głównego musimy go ponownie spakować, aby przekonwertować go na maksymalną stertę.

Algorytm sortowania sterty

Po zamianie elementu tablicy 76 z 9 i konwertując stertę na maksymalną stertę, elementami tablicy są -

Algorytm sortowania sterty

W kolejnym kroku ponownie musimy usunąć element główny (54) z maksymalnej sterty. Aby usunąć ten węzeł, musimy zamienić go z ostatnim węzłem, tj. (14). Po usunięciu elementu głównego musimy go ponownie spakować, aby przekonwertować go na maksymalną stertę.

Algorytm sortowania sterty

Po zamianie elementu tablicy 54 z 14 i konwertując stertę na maksymalną stertę, elementami tablicy są -

Algorytm sortowania sterty

W kolejnym kroku ponownie musimy usunąć element główny (22) z maksymalnej sterty. Aby usunąć ten węzeł, musimy zamienić go z ostatnim węzłem, tj. (jedenaście). Po usunięciu elementu głównego musimy go ponownie spakować, aby przekonwertować go na maksymalną stertę.

Algorytm sortowania sterty

Po zamianie elementu tablicy 22 z jedenaście i konwertując stertę na maksymalną stertę, elementami tablicy są -

mój flixer
Algorytm sortowania sterty

W kolejnym kroku ponownie musimy usunąć element główny (14) z maksymalnej sterty. Aby usunąć ten węzeł, musimy zamienić go z ostatnim węzłem, tj. (9). Po usunięciu elementu głównego musimy go ponownie spakować, aby przekonwertować go na maksymalną stertę.

Algorytm sortowania sterty

Po zamianie elementu tablicy 14 z 9 i konwertując stertę na maksymalną stertę, elementami tablicy są -

Algorytm sortowania sterty

W kolejnym kroku ponownie musimy usunąć element główny (jedenaście) z maksymalnej sterty. Aby usunąć ten węzeł, musimy zamienić go z ostatnim węzłem, tj. (9). Po usunięciu elementu głównego musimy go ponownie spakować, aby przekonwertować go na maksymalną stertę.

Algorytm sortowania sterty

Po zamianie elementu tablicy jedenaście z 9, elementy tablicy to -

Algorytm sortowania sterty

Teraz na stercie pozostał tylko jeden element. Po jego usunięciu sterta będzie pusta.

Algorytm sortowania sterty

Po zakończeniu sortowania elementy tablicy są -

Algorytm sortowania sterty

Teraz tablica jest całkowicie posortowana.

Złożoność sortowania sterty

Przyjrzyjmy się teraz złożoności czasowej sortowania sterty w najlepszym, średnim i najgorszym przypadku. Zobaczymy także złożoność przestrzenną Heapsort.

1. Złożoność czasowa

Sprawa Złożoność czasu
Najlepszy przypadek O(n log)
Przeciętny przypadek O(n log n)
Najgorszy przypadek O(n log n)
    Najlepsza złożoność przypadku —Występuje, gdy nie jest wymagane sortowanie, czyli tablica jest już posortowana. W najlepszym przypadku złożoność czasowa sortowania sterty wynosi O(n log). Średnia złożoność przypadku —Dzieje się tak, gdy elementy tablicy są w pomieszanej kolejności, która nie jest prawidłowo rosnąca i nieprawidłowo malejąca. Średnia złożoność czasowa sortowania sterty wynosi O(n log n). Najgorsza złożoność przypadku —Występuje, gdy elementy tablicy muszą zostać posortowane w odwrotnej kolejności. Oznacza to, że załóżmy, że musisz posortować elementy tablicy w kolejności rosnącej, ale jej elementy są w kolejności malejącej. Najgorszy przypadek złożoności czasowej sortowania sterty to O(n log n).

Złożoność czasowa sortowania na stercie wynosi O(n log) we wszystkich trzech przypadkach (najlepszy przypadek, średni przypadek i najgorszy przypadek). Wysokość pełnego drzewa binarnego mającego n elementów wynosi spokój.

2. Złożoność przestrzeni

Złożoność przestrzeni O(1)
Stabilny Nie
  • Złożoność przestrzenna sortowania sterty wynosi O(1).

Implementacja Heapsortu

Teraz przyjrzyjmy się programom Heap sortującym w różnych językach programowania.

Program: Napisz program realizujący sortowanie sterty w języku 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;>