logo

Алгоритм сортування купи

У цій статті ми обговоримо алгоритм Heapsort. Сортування купи обробляє елементи шляхом створення мінімальної або максимальної купи з використанням елементів заданого масиву. Мінімальна купа або максимальна купа представляє порядок масиву, у якому кореневий елемент представляє мінімальний або максимальний елемент масиву.

Сортування купи в основному рекурсивно виконує дві основні операції -

  • Побудуйте купу H, використовуючи елементи масиву.
  • Повторно видаліть кореневий елемент купи, сформованої в 1вулфаза.

Перш ніж дізнатися більше про сортування купи, давайте спочатку подивимося короткий опис Купа.

Що таке купа?

Купа — це повне бінарне дерево, а бінарне дерево — це дерево, у якому вузол може мати щонайбільше двох дітей. Повне двійкове дерево — це двійкове дерево, у якому всі рівні, крім останнього рівня, тобто листкового вузла, повинні бути повністю заповнені, а всі вузли мають бути вирівняні за лівим краєм.

Що таке сортування купи?

Heapsort — популярний і ефективний алгоритм сортування. Концепція сортування купи полягає в тому, щоб вилучати елементи один за одним із частини купи списку, а потім вставляти їх у відсортовану частину списку.

Heapsort — це алгоритм сортування на місці.

основи java

Тепер розглянемо алгоритм сортування купи.

Алгоритм

 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 

Робота алгоритму сортування купи

Тепер давайте подивимося, як працює алгоритм Heapsort.

Сортування купи складається з двох етапів сортування елементів. За допомогою алгоритму сортування купи вони такі:

  • Перший крок включає створення купи шляхом коригування елементів масиву.
  • Після створення купи тепер кілька разів видаліть кореневий елемент купи, перемістивши його в кінець масиву, а потім збережіть структуру купи з рештою елементів.

Тепер давайте детально розглянемо роботу сортування купи на прикладі. Щоб зрозуміти це більш чітко, давайте візьмемо несортований масив і спробуємо відсортувати його за допомогою сортування купи. Це зробить пояснення зрозумілішим і легшим.

Алгоритм сортування купи

По-перше, ми повинні створити купу з заданого масиву та перетворити її на максимальну купу.

Алгоритм сортування купи

Після перетворення даної купи в максимальну купу елементи масиву:

Алгоритм сортування купи

Далі ми повинні видалити кореневий елемент (89) з максимальної купи. Щоб видалити цей вузол, ми повинні поміняти його місцями з останнім вузлом, тобто. (одинадцять). Після видалення кореневого елемента ми знову повинні об’єднати його, щоб перетворити на максимальну купу.

Алгоритм сортування купи

Після заміни елемента масиву 89 з одинадцять, і перетворюючи купу в максимальну купу, елементи масиву -

Алгоритм сортування купи

На наступному кроці нам знову потрібно видалити кореневий елемент (81) з максимальної купи. Щоб видалити цей вузол, ми повинні поміняти його місцями з останнім вузлом, тобто. (54). Після видалення кореневого елемента ми знову повинні об’єднати його, щоб перетворити на максимальну купу.

Алгоритм сортування купи

Після заміни елемента масиву 81 з 54 і перетворюючи купу в максимальну купу, елементи масиву -

Алгоритм сортування купи

На наступному кроці ми повинні видалити кореневий елемент (76) знову з максимальної купи. Щоб видалити цей вузол, ми повинні поміняти його місцями з останнім вузлом, тобто. (9). Після видалення кореневого елемента ми знову повинні об’єднати його, щоб перетворити на максимальну купу.

алфавіт і цифри
Алгоритм сортування купи

Після заміни елемента масиву 76 з 9 і перетворюючи купу в максимальну купу, елементи масиву -

Алгоритм сортування купи

На наступному кроці нам знову потрібно видалити кореневий елемент (54) з максимальної купи. Щоб видалити цей вузол, ми повинні поміняти його місцями з останнім вузлом, тобто. (14). Після видалення кореневого елемента ми знову повинні об’єднати його, щоб перетворити на максимальну купу.

Алгоритм сортування купи

Після заміни елемента масиву 54 з 14 і перетворюючи купу в максимальну купу, елементи масиву -

Алгоритм сортування купи

На наступному кроці нам знову потрібно видалити кореневий елемент (22) з максимальної купи. Щоб видалити цей вузол, ми повинні поміняти його місцями з останнім вузлом, тобто. (одинадцять). Після видалення кореневого елемента ми знову повинні об’єднати його, щоб перетворити на максимальну купу.

Алгоритм сортування купи

Після заміни елемента масиву 22 з одинадцять і перетворюючи купу в максимальну купу, елементи масиву -

Алгоритм сортування купи

На наступному кроці нам знову потрібно видалити кореневий елемент (14) з максимальної купи. Щоб видалити цей вузол, ми повинні поміняти його місцями з останнім вузлом, тобто. (9). Після видалення кореневого елемента ми знову повинні об’єднати його, щоб перетворити на максимальну купу.

Алгоритм сортування купи

Після заміни елемента масиву 14 з 9 і перетворюючи купу в максимальну купу, елементи масиву -

Алгоритм сортування купи

На наступному кроці нам знову потрібно видалити кореневий елемент (одинадцять) з максимальної купи. Щоб видалити цей вузол, ми повинні поміняти його місцями з останнім вузлом, тобто. (9). Після видалення кореневого елемента ми знову повинні об’єднати його, щоб перетворити на максимальну купу.

Алгоритм сортування купи

Після заміни елемента масиву одинадцять з 9, елементи масиву -

Алгоритм сортування купи

Тепер у купі залишився лише один елемент. Після видалення купа буде порожньою.

Алгоритм сортування купи

Після завершення сортування елементи масиву -

Алгоритм сортування купи

Тепер масив повністю відсортований.

Складність сортування купи

Тепер давайте подивимося на часову складність сортування купи в найкращому, середньому та гіршому випадку. Ми також побачимо космічну складність Heapsort.

1. Складність часу

Справа Складність часу
Кращий випадок O (n журнал)
Середній випадок O(n log n)
Найгірший випадок O(n log n)
    Найкращий варіант складності -Це відбувається, коли сортування не потрібно, тобто масив уже відсортовано. Оптимальна часова складність сортування купи O(n журнал). Середня складність справи -Це відбувається, коли елементи масиву розташовані в перемішаному порядку, який неправильно зростає та спадає. Середня складність випадку сортування купи становить O(n log n). Найгірша складність -Це відбувається, коли елементи масиву потрібно відсортувати у зворотному порядку. Це означає, що ви повинні відсортувати елементи масиву в порядку зростання, але його елементи розташовані в порядку спадання. Найгірша часова складність сортування купи O(n log n).

Часова складність сортування купи становить O (n журнал) у всіх трьох випадках (найкращому випадку, середньому випадку та гіршому випадку). Висота повного бінарного дерева з n елементів дорівнює спокійний.

2. Просторова складність

Космічна складність O(1)
Стабільний N0
  • Просторова складність сортування купи дорівнює O(1).

Реалізація Heapsort

Тепер давайте подивимося на програми Heap сортування на різних мовах програмування.

програма: Напишіть програму для реалізації сортування купи мовою 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;>