merge sort c with examples
Техніка сортування злиття C ++.
Алгоритм сортування злиття використовує “ розділяй і володарюй ”Стратегія, в якій ми ділимо проблему на підзадачі та вирішуємо ці підзадачі індивідуально.
Потім ці підзадачі об’єднуються або об’єднуються разом, утворюючи єдине рішення.
=> Ознайомтесь з Популярною серією навчальних програм C ++ тут.
Що ви дізнаєтесь:
найкраще безкоштовне програмне забезпечення для резервного копіювання для Windows 10 2017
- Огляд
- Загальний алгоритм
- Псевдокод для сортування злиття
- Ілюстрація
- Ітеративне сортування злиття
- Аналіз складності алгоритму сортування злиття
- Висновок
- Рекомендована література
Огляд
Сортування злиття виконується за допомогою таких кроків:
# 1) Список, що підлягає сортуванню, ділиться на два масиви однакової довжини шляхом поділу списку на середній елемент. Якщо кількість елементів у списку дорівнює 0 або 1, тоді список вважається відсортованим.
# два) Кожен підспис сортується окремо за допомогою рекурсивного сортування злиттям.
# 3) Потім відсортовані підсписки об’єднуються або об’єднуються, утворюючи повний відсортований список.
Загальний алгоритм
Загальний псевдокод для техніки сортування злиття наведено нижче.
Оголосіть масив Arr довжиною N
Якщо N = 1, Arr вже відсортовано
Якщо N> 1,
Ліва = 0, права = N-1
Знайти середину = (ліворуч + праворуч) / 2
Виклик merge_sort (Arr, left, middle) => рекурсивно сортувати першу половину
Виклик merge_sort (Arr, middle + 1, right) => рекурсивно сортувати другу половину
Викличте злиття (Arr, ліворуч, посередині, праворуч), щоб об’єднати відсортовані масиви в кроках вище.
Вихід
Як показано у вищенаведеному псевдокоді, в алгоритмі сортування злиття ми ділимо масив навпіл і сортуємо кожну половину за допомогою злиття сортування рекурсивно. Як тільки підмасиви сортуються окремо, два підмасиви об’єднуються разом, утворюючи повний відсортований масив.
Псевдокод для сортування злиття
Далі наведено псевдокод для техніки сортування злиття. По-перше, у нас є процедура злиття процедур, щоб розділити масив на половинки рекурсивно. Тоді у нас є процедура злиття, яка об’єднає відсортовані менші масиви, щоб отримати повний відсортований масив.
procedure mergesort( array,N ) array – list of elements to be sorted N – number of elements in the list begin if ( N == 1 ) return array var array1 as array = a(0) ... a(N/2) var array2 as array = a(N/2+1) ... a(N) array1 = mergesort(array1) array2 = mergesort(array2) return merge( array1, array2 ) end procedure procedure merge(array1, array2 ) array1 – first array array2 – second array begin var c as array while ( a and b have elements ) if ( array1(0) > array2(0) ) add array2 (0) to the end of c remove array2 (0) from array2 else add array1 (0) to the end of c remove array1 (0) from array1 end if end while while ( a has elements ) add a(0) to the end of c remove a(0) from a end while while ( b has elements ) add b(0) to the end of c remove b(0) from b end while return c end procedure
Проілюструємо тепер техніку сортування злиттям на прикладі.
Ілюстрація
Наведена вище ілюстрація може бути представлена у вигляді таблиці нижче:
Пройти | Несортований список | розділити | Відсортований список |
---|---|---|---|
1 | {12, 23,2,43,51,35,19,4} | {12,23,2,43} {51,35,19,4} | {} |
два | {12,23,2,43} {51,35,19,4} | {12,23} {2,43} {51,35} {19,4} | {} |
3 | {12,23} {2,43} {51,35} {19,4} | {12,23} {2,43} {35,51} {4,19} | {12,23} {2,43} {35,51} {4,19} |
4 | {12,23} {2,43} {35,51} {4,19} | {2,12,23,43} {4,19,35,51} | {2,12,23,43} {4,19,35,51} |
5 | {2,12,23,43} {4,19,35,51} | {2,4,12,19,23,35,43,51} | {2,4,12,19,23,35,43,51} |
6 | {} | {} | {2,4,12,19,23,35,43,51} |
Як показано у наведеному вище поданні, спочатку масив ділиться на два підмасиви довжиною 4. Кожен підмасив далі поділяється на ще два підмасиви довжиною 2. Кожен підмасив далі поділяється на підмасив по одному елементу кожен. Весь цей процес є процесом 'Розділення'.
Після того, як ми розділили масив на підмасиви по одному елементу, тепер нам доведеться об'єднати ці масиви у відсортованому порядку.
Як показано на ілюстрації вище, ми розглядаємо кожен підмасив окремого елемента і спочатку поєднуємо елементи, утворюючи підмасиви двох елементів у відсортованому порядку. Далі відсортовані підмасиви довжиною два сортуються та об’єднуються, утворюючи два підмасиви довжиною чотири. Потім ми поєднуємо ці два підмасиви, щоб сформувати повний відсортований масив.
Ітеративне сортування злиття
Ми бачили вище алгоритм або техніку сортування злиття, використовує рекурсію. Він також відомий як “ рекурсивне сортування '.
Ми знаємо, що рекурсивні функції використовують стек викликів функцій для зберігання проміжного стану функції виклику. Він також зберігає іншу бухгалтерську інформацію щодо параметрів тощо і створює накладні витрати з точки зору збереження запису активації виклику функції, а також відновлення виконання.
Від усіх цих накладних витрат можна позбутися, якщо ми використовуємо ітераційні функції замість рекурсивних. Зазначений алгоритм сортування злиття також може бути легко перетворений в ітеративні кроки за допомогою циклів та прийняття рішень.
Як і рекурсивне сортування злиття, ітераційне сортування злиття також має складність O (nlogn), отже, мудрі результати, вони виконуються нарівні один з одним. Ми просто можемо знизити накладні витрати.
У цьому навчальному посібнику ми зосередилися на рекурсивному сортуванні злиття, а далі ми реалізуємо рекурсивне сортування злиття за допомогою мов C ++ та Java.
Нижче наведено реалізацію техніки сортування злиття за допомогою C ++.
#include using namespace std; void merge(int *,int, int , int ); void merge_sort(int *arr, int low, int high) { int mid; if (low num; cout<<'Enter '<myarray(i); } merge_sort(myarray, 0, num-1); cout<<'Sorted array
'; for (int i = 0; i < num; i++) { cout< Вихід:
Введіть кількість елементів для сортування: 10
Введіть 10 елементів для сортування: 101 10 2 43 12 54 34 64 89 76
Відсортований масив
2 10 12 34 43 54 64 76 89 101
У цій програмі ми визначили дві функції: злиття_сортування і піти . У функції merge_sort ми ділимо масив на два рівні масиви і викликаємо функцію злиття на кожному з цих підмасивів. У функції злиття ми виконуємо фактичне сортування цих підмасивів, а потім об’єднуємо їх в один повний відсортований масив.
Далі ми впроваджуємо техніку сортування злиття на мові Java.
class MergeSort { void merge(int arr(), int beg, int mid, int end) { int left = mid - beg + 1; int right = end - mid; int Left_arr() = new int (left); int Right_arr() = new int (right); for (int i=0; i Вихід:
Вхідний масив
101 10 2 43 12 54 34 64 89 76
Масив відсортований за допомогою злиття
2 10 12 34 43 54 64 76 89 101
Також у реалізації Java ми використовуємо ту саму логіку, що і в реалізації С ++.
Сортування злиття - це ефективний спосіб сортування списків, який в основному використовується для сортування пов'язаних списків. Оскільки він використовує підхід поділу та завоювання, техніка сортування злиття однаково ефективно працює як для менших, так і для більших масивів.
Аналіз складності алгоритму сортування злиття
Ми знаємо, що для того, щоб виконати сортування за допомогою злиття, ми спочатку ділимо масив на дві рівні половини. Це представлено “log n”, що є логарифмічною функцією, і кількість виконаних кроків становить log (n + 1) щонайбільше.
Далі, щоб знайти середній елемент масиву, нам потрібен один крок, тобто O (1).
Потім, щоб об’єднати підмасиви в масив з n елементів, ми візьмемо O (n) кількість часу роботи.
Таким чином, загальний час для сортування злиття буде n (log n + 1), що надає нам часову складність O (n * logn).
Найгірша складність часу O (n * log n) Найкраща складність часу O (n * log n) Середня часова складність O (n * log n) Складність простору O (n)
Складність часу для сортування злиття однакова у всіх трьох випадках (найгірший, найкращий та середній), оскільки вона завжди ділить масив на підмасиви, а потім об’єднує підмасиви за лінійним часом.
Сортування злиття завжди займає рівну кількість місця як невідсортовані масиви. Отже, коли список для сортування є масивом, сортування злиттям не слід використовувати для дуже великих масивів. Однак сортування злиттям можна використовувати ефективніше для сортування пов'язаних списків.
Висновок
Сортування злиття використовує стратегію 'розділи і завоюй', яка розділяє масив або список на численні підмасиви та сортує їх окремо, а потім об'єднує в повний відсортований масив.
Сортування злиття виконується швидше, ніж інші методи сортування, а також ефективно працює для менших і більших масивів також.
Ми дізнаємось більше про швидке сортування у нашому майбутньому уроці!
=> Зверніть увагу на навчальний посібник для початківців C ++ тут.
Рекомендована література
- Метод сортування MongoDB () із прикладами
- Команда сортування Unix із синтаксисом, опціями та прикладами
- Сортування оболонки в C ++ з прикладами
- Сортування купи в C ++ з прикладами
- Сортування виділення в C ++ із прикладами
- Сортування міхура в C ++ із прикладами
- Сортування вставки в C ++ із прикладами
- Швидке сортування в C ++ із прикладами