heap sort c with examples
Wprowadzenie do sortowania na stosach z przykładami.
Heapsort to jedna z najbardziej wydajnych technik sortowania. Ta technika tworzy stertę z podanej nieposortowanej tablicy, a następnie używa sterty ponownie do sortowania tablicy.
Heapsort to technika sortowania oparta na porównaniu i korzystająca ze stosu binarnego.
=> Przeczytaj serię szkoleń Easy C ++.
pytania i odpowiedzi na rozmowę z testami soapui
Czego się nauczysz:
- Co to jest stos binarny?
- Algorytm ogólny
- Ilustracja
- Przykład w C ++
- Przykład Java
- Wniosek
- rekomendowane lektury
Co to jest stos binarny?
Sterta binarna jest reprezentowana za pomocą pełnego drzewa binarnego. Kompletne drzewo binarne to drzewo binarne, w którym wszystkie węzły na każdym poziomie są całkowicie wypełnione, z wyjątkiem węzłów liści, a węzły znajdują się tak daleko, jak w lewo.
Sterta binarna lub po prostu sterta to kompletne drzewo binarne, w którym elementy lub węzły są przechowywane w taki sposób, że węzeł główny jest większy niż jego dwa węzły potomne. Nazywa się to również maksymalnym stosem.
Elementy w binarnej stercie mogą być również przechowywane jako min-sterta, w której węzeł główny jest mniejszy niż jego dwa węzły podrzędne. Możemy przedstawić stertę jako drzewo binarne lub tablicę.
Przedstawiając stertę jako tablicę, zakładając, że indeks zaczyna się od 0, element główny jest przechowywany na 0. Generalnie, jeśli węzeł nadrzędny znajduje się w pozycji I, wówczas lewy węzeł potomny znajduje się na pozycji (2 * I + 1), a prawy węzeł znajduje się w (2 * I +2).
Algorytm ogólny
Poniżej podano ogólny algorytm techniki sortowania na stosie.
- Zbuduj maksymalną stertę z podanych danych tak, aby korzeń był najwyższym elementem sterty.
- Usuń korzeń, czyli najwyższy element sterty i zamień lub zamień go na ostatni element sterty.
- Następnie dostosuj maksymalną stertę, aby nie naruszyć właściwości maksymalnej sterty (heapify).
- Powyższy krok zmniejsza rozmiar sterty o 1.
- Powtarzaj powyższe trzy kroki, aż rozmiar sterty zostanie zmniejszony do 1.
Jak pokazano w ogólnym algorytmie sortowania danego zestawu danych w kolejności rosnącej, najpierw konstruujemy maksymalny stertę dla podanych danych.
Weźmy przykład konstruowania maksymalnego sterty z następującym zestawem danych.
6, 10, 2, 4, 1
Możemy skonstruować drzewo dla tego zbioru danych w następujący sposób.
W powyższej reprezentacji drzewa liczby w nawiasach oznaczają odpowiednie pozycje w tablicy.
Aby skonstruować maksymalną stertę powyższej reprezentacji, musimy spełnić warunek sterty, że węzeł nadrzędny powinien być większy niż jego węzły potomne. Innymi słowy, musimy „ułożyć” drzewo, aby przekonwertować je na max-heap.
Po uformowaniu powyższego drzewa otrzymamy maksymalny stos, jak pokazano poniżej.
Jak pokazano powyżej, mamy ten maksymalny stert wygenerowany z tablicy.
Następnie przedstawiamy ilustrację rodzaju stosu. Po zapoznaniu się z konstrukcją max-sterty pominiemy szczegółowe kroki, aby skonstruować max-stertę i bezpośrednio pokażemy maksymalną stertę na każdym kroku.
Ilustracja
Rozważ następującą tablicę elementów. Musimy posortować tę tablicę przy użyciu techniki sortowania stosu.
Skonstruujmy stertę maksymalną, jak pokazano poniżej, aby posortować tablicę.
Po skonstruowaniu sterty przedstawiamy ją w postaci tablicy, jak pokazano poniżej.
Teraz porównujemy 1śwwęzeł (korzeń) z ostatnim węzłem, a następnie zamień je. Tak więc, jak pokazano powyżej, zamieniamy 17 i 3 tak, że 17 jest na ostatniej pozycji, a 3 na pierwszej pozycji.
Teraz usuwamy węzeł 17 ze sterty i umieszczamy go w posortowanej tablicy, jak pokazano w zacienionej części poniżej.
Teraz ponownie tworzymy stertę dla elementów tablicy. Tym razem rozmiar sterty jest zmniejszony o 1, ponieważ usunęliśmy jeden element (17) ze sterty.
Stos pozostałych elementów pokazano poniżej.
W następnym kroku powtórzymy te same kroki.
Porównujemy i zamieniamy element główny i ostatni element w stercie.
Po zamianie usuwamy element 12 ze sterty i przenosimy go do posortowanej tablicy.
darmowe oprogramowanie do odzyskiwania danych windows 10
Ponownie konstruujemy maksymalny stos dla pozostałych elementów, jak pokazano poniżej.
Teraz zamieniamy korzeń i ostatni element czyli 9 i 3. Po zamianie element 9 jest usuwany ze stosu i umieszczany w posortowanej tablicy.
W tym momencie mamy tylko trzy elementy w stercie, jak pokazano poniżej.
Zamieniamy 6 i 3, usuwamy element 6 ze sterty i dodajemy go do posortowanej tablicy.
Teraz tworzymy stertę pozostałych elementów, a następnie zamieniamy je między sobą.
Po zamianie 4 i 3 usuwamy element 4 ze sterty i dodajemy go do posortowanej tablicy. Teraz w stercie pozostaje tylko jeden węzeł, jak pokazano poniżej .
Więc teraz, gdy pozostał tylko jeden węzeł, usuwamy go ze sterty i dodajemy do posortowanej tablicy.
Zatem pokazana powyżej jest posortowaną tablicą, którą otrzymaliśmy w wyniku sortowania sterty.
Na powyższej ilustracji posortowaliśmy tablicę w porządku rosnącym. Jeśli musimy posortować tablicę w porządku malejącym, musimy wykonać te same kroki, ale z min-stertą.
Algorytm Heapsort jest identyczny z sortowaniem przez wybór, w którym zaznaczamy najmniejszy element i umieszczamy go w posortowanej tablicy. Jednak sortowanie na stercie jest szybsze niż sortowanie przez wybór, jeśli chodzi o wydajność. Możemy powiedzieć, że heapsort to ulepszona wersja sortowania przez wybór.
Następnie zaimplementujemy Heapsort w języku C ++ i Java.
Najważniejszą funkcją w obu implementacjach jest funkcja „heapify”. Ta funkcja jest wywoływana przez główną procedurę heapsort w celu zmiany układu poddrzewa po usunięciu węzła lub zbudowaniu max-heap.
Dopiero po poprawnym ułożeniu drzewa na stosie będziemy w stanie pobrać poprawne elementy na ich właściwe pozycje i dzięki temu tablica zostanie poprawnie posortowana.
Przykład w C ++
Poniżej znajduje się kod C ++ implementacji heapsort.
#include using namespace std; // function to heapify the tree void heapify(int arr(), int n, int root) { int largest = root; // root is the largest element int l = 2*root + 1; // left = 2*root + 1 int r = 2*root + 2; // right = 2*root + 2 // If left child is larger than root if (l arr(largest)) largest = l; // If right child is larger than largest so far if (r arr(largest)) largest = r; // If largest is not root if (largest != root) { //swap root and largest swap(arr(root), arr(largest)); // Recursively heapify the sub-tree heapify(arr, n, largest); } } // implementing heap sort void heapSort(int arr(), int n) { // build heap for (int i = n / 2 - 1; i >= 0; i--) heapify(arr, n, i); // extracting elements from heap one by one for (int i=n-1; i>=0; i--) { // Move current root to end swap(arr(0), arr(i)); // again call max heapify on the reduced heap heapify(arr, i, 0); } } /* print contents of array - utility function */ void displayArray(int arr(), int n) { for (int i=0; i Wynik:
Tablica wejściowa
4 17 3 12 9 6
Posortowana tablica
3 4 6 9 12 17
Następnie zaimplementujemy heapsort w języku Java
Przykład Java
// Java program to implement Heap Sort class HeapSort { public void heap_sort(int arr()) { int n = arr.length; // Build heap (rearrange array) for (int i = n / 2 - 1; i >= 0; i--) heapify(arr, n, i); // One by one extract an element from heap for (int i=n-1; i>=0; i--) { // Move current root to end int temp = arr(0); arr(0) = arr(i); arr(i) = temp; // call max heapify on the reduced heap heapify(arr, i, 0); } } // heapify the sub-tree void heapify(int arr(), int n, int root) { int largest = root; // Initialize largest as root int l = 2*root + 1; // left = 2*root + 1 int r = 2*root + 2; // right = 2*root + 2 // If left child is larger than root if (l arr(largest)) largest = l; // If right child is larger than largest so far if (r arr(largest)) largest = r; // If largest is not root if (largest != root) { int swap = arr(root); arr(root) = arr(largest); arr(largest) = swap; // Recursively heapify the affected sub-tree heapify(arr, n, largest); } } //print array contents - utility function static void displayArray(int arr()) { int n = arr.length; for (int i=0; i Wynik:
Tablica wejściowa:
4 17 3 12 9 6
Posortowana tablica:
sql server 2012 pytania do wywiadów i odpowiedzi dla doświadczonych plików PDF
3 4 6 9 12 17
Wniosek
Heapsort jest techniką sortowania opartą na porównaniu z wykorzystaniem stosu binarnego.
Można to określić jako ulepszenie sortowania przez wybór, ponieważ obie te techniki sortowania działają z podobną logiką polegającą na wielokrotnym znajdowaniu największego lub najmniejszego elementu w tablicy, a następnie umieszczaniu go w posortowanej tablicy.
Sortowanie na stosie używa max-heap lub min-heap do sortowania tablicy. Pierwszym krokiem w sortowaniu sterty jest zbudowanie sterty minimalnej lub maksymalnej z danych tablicy, a następnie rekursywne usunięcie elementu głównego i stertowanie sterty do momentu, gdy w stercie będzie tylko jeden węzeł.
Heapsort jest wydajnym algorytmem i działa szybciej niż sortowanie przez wybór. Może służyć do sortowania prawie posortowanej tablicy lub wyszukiwania k największych lub najmniejszych elementów w tablicy.
Tym samym zakończyliśmy nasz temat dotyczący technik sortowania w C ++. Od naszego następnego samouczka zaczniemy od struktur danych jeden po drugim.
=> Poszukaj całej serii szkoleń C ++ tutaj.
rekomendowane lektury
- Metoda MongoDB Sort () z przykładami
- Polecenie sortowania systemu Unix ze składnią, opcjami i przykładami
- Sortuj w C ++ z przykładami
- Sortowanie powłoki w C ++ z przykładami
- Sortuj przez wstawianie w C ++ z przykładami
- Wybór sortowania w C ++ z przykładami
- Sortuj bąbelkowe w C ++ z przykładami
- Szybkie sortowanie w C ++ z przykładami