heap sort c with examples
Вступ до сортування купи з прикладами.
Хіпсорт - одна з найефективніших технік сортування. Ця техніка створює купу з даного несортованого масиву, а потім знову використовує купу для сортування масиву.
Хепсорт - це техніка сортування, заснована на порівнянні та використовує двійкову купу.
=> Прочитайте навчальну серію Easy C ++.
Запитання та відповіді на тестування програмного забезпечення для досвідчених
Що ви дізнаєтесь:
- Що таке двійкова купа?
- Загальний алгоритм
- Ілюстрація
- Приклад С ++
- Приклад Java
- Висновок
- Рекомендована література
Що таке двійкова купа?
Двійкова купа представлена з використанням повного двійкового дерева. Повне бінарне дерево - це бінарне дерево, в якому всі вузли на кожному рівні повністю заповнені, за винятком листових вузлів, і вузли знаходяться так далеко, як зліва.
Двійкова куча або просто купа - це повне двійкове дерево, де елементи або вузли зберігаються таким чином, що кореневий вузол перевищує два його дочірні вузли. Це також називається max heap.
Елементи у двійковій купі також можна зберігати як min-heap, де кореневий вузол менший за два його дочірні вузли. Ми можемо представити купу як двійкове дерево або масив.
Представляючи купу як масив, припускаючи, що індекс починається з 0, кореневий елемент зберігається в 0. Загалом, якщо батьківський вузол знаходиться в положенні I, тоді лівий дочірній вузол знаходиться в положенні (2 * I + 1), а правий вузол - (2 * I +2).
Загальний алгоритм
Нижче наведено загальний алгоритм техніки сортування купи.
- Створіть максимальну купу з даних даних таким чином, щоб корінь був найвищим елементом купи.
- Видаліть корінь, тобто найвищий елемент із купи, і замініть або поміняйте його останнім елементом купи.
- Потім відрегулюйте максимальну купу, щоб не порушувати властивості максимальної купи (heapify).
- Вищевказаний крок зменшує розмір купи на 1.
- Повторюйте вищезазначені три кроки, доки розмір купи не зменшиться до 1.
Як показано в загальному алгоритмі сортування даного набору даних у зростаючому порядку, спочатку ми створюємо максимальну купу для даних даних.
Давайте візьмемо приклад для побудови максимальної купи з наступним набором даних.
6, 10, 2, 4, 1
Ми можемо побудувати дерево для цього набору даних наступним чином.
У наведеному вище поданні дерева цифри в дужках представляють відповідні позиції в масиві.
Для того, щоб побудувати максимальну купу вищевказаного подання, нам потрібно виконати умову купи, що батьківський вузол повинен бути більшим, ніж його дочірні вузли. Іншими словами, нам потрібно «згустити» дерево, щоб перетворити його на max-heap.
Після нагромадження вищезазначеного дерева ми отримаємо максимальну купу, як показано нижче.
Як показано вище, ми маємо цю макс-купу, згенеровану з масиву.
Далі ми представляємо ілюстрацію сорту купи. Побачивши побудову max-heap, ми пропустимо докладні кроки для побудови max-heap і безпосередньо покажемо max-купу на кожному кроці.
Ілюстрація
Розглянемо наступний масив елементів. Нам потрібно відсортувати цей масив, використовуючи техніку сортування купи.
Давайте побудуємо max-heap, як показано нижче, для сортування масиву.
Після побудови купи ми представляємо її у формі масиву, як показано нижче.
Тепер порівняємо 1вулвузол (корінь) з останнім вузлом, а потім поміняйте місцями. Таким чином, як показано вище, ми поміняємо місцями 17 і 3 таким чином, щоб 17 знаходився в останньому положенні, а 3 - у першому.
Тепер ми видаляємо вузол 17 з купи і поміщаємо його в відсортований масив, як показано в затіненій частині нижче.
Тепер ми знову будуємо купу для елементів масиву. Цього разу розмір купи зменшується на 1, оскільки ми видалили один елемент (17) із купи.
Купа решти елементів показана нижче.
На наступному кроці ми повторимо ті самі кроки.
Ми порівнюємо та міняємо місцями кореневий елемент та останній елемент у купі.
Після обміну, ми видаляємо елемент 12 з купи і переносимо його в відсортований масив.
Ще раз ми створюємо максимальну купу для решти елементів, як показано нижче.
Тепер ми поміняємо місцями корінь і останній елемент, тобто 9 і 3. Після заміни елемент 9 видаляється з купи і поміщається в відсортований масив.
На даний момент у нас у купі лише три елементи, як показано нижче.
Ми поміняємо місцями 6 і 3 і видалимо елемент 6 з купи і додамо його до відсортованого масиву.
найкращий блокувальник спливаючих вікон для хрому
Тепер ми побудуємо купу решти елементів, а потім поміняємо місцями обоє між собою.
Після обміну місцями 4 і 3, ми видаляємо елемент 4 з купи і додаємо його до відсортованого масиву. Тепер у нас залишився лише один вузол у купі, як показано нижче .
Тож тепер, коли залишився лише один вузол, ми видаляємо його з купи і додаємо до відсортованого масиву.
Таким чином, наведене вище - це відсортований масив, який ми отримали в результаті сортування купи.
На наведеній вище ілюстрації ми сортували масив за зростанням. Якщо нам доводиться сортувати масив за спаданням, то нам потрібно виконати ті самі кроки, але з міні-купою.
Алгоритм 'Хепсорт' ідентичний сортуванню виділення, в якому ми вибираємо найменший елемент і розміщуємо його в відсортованому масиві. Однак сортування купи є швидшим, ніж сортування виділення, що стосується продуктивності. Ми можемо сказати, що купчастий сорт - це вдосконалена версія сортування виділення.
Далі ми реалізуємо Heapsort на мові C ++ та Java.
Найважливішою функцією в обох реалізаціях є функція “heapify”. Ця функція викликається основною програмою купірування, щоб переставити піддерево після видалення вузла або при створенні max-heap.
Коли ми правильно сформували дерево, лише тоді ми зможемо отримати правильні елементи у їх належних положеннях, і таким чином масив буде правильно відсортований.
Приклад С ++
Далі наведено код C ++ для реалізації купірувального сорту.
#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 Вихід:
Запитання та відповіді на співбесіду при розробці бази даних
Вхідний масив
4 17 3 12 9 6
Відсортований масив
3 4 6 9 12 17
Далі ми будемо реалізовувати сортування на мові Java
Приклад 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 Вихід:
Вхідний масив:
4 17 3 12 9 6
Відсортований масив:
3 4 6 9 12 17
Висновок
Хепсорт - це техніка сортування на основі порівняння з використанням двійкової купи.
Це можна назвати покращенням порівняно з сортуванням виділення, оскільки обидва ці способи сортування працюють з подібною логікою знаходження найбільшого або найменшого елемента масиву багаторазово, а потім розміщення його в відсортованому масиві.
Сортування купи використовує max-heap або min-heap для сортування масиву. Першим кроком у сортуванні купи є створення мінімальної або максимальної купи з даних масиву, а потім рекурсивне видалення кореневого елемента та куча купи, поки в купі не буде присутній лише один вузол.
Хепсорт є ефективним алгоритмом, і він працює швидше, ніж сортування за вибором. Він може бути використаний для сортування майже відсортованого масиву або пошуку k найбільших або найменших елементів у масиві.
Цим ми завершили нашу тему щодо методів сортування в C ++. Починаючи з нашого наступного підручника, ми почнемо зі структур даних по одному.
=> Шукайте тут цілі навчальні серії C ++.
Рекомендована література
- Метод сортування MongoDB () із прикладами
- Команда сортування Unix із синтаксисом, опціями та прикладами
- Об’єднати сортування в C ++ із прикладами
- Сортування оболонки в C ++ з прикладами
- Сортування вставки в C ++ із прикладами
- Сортування виділення в C ++ із прикладами
- Сортування міхура в C ++ із прикладами
- Швидке сортування в C ++ із прикладами