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

Алгоритм сортування злиттям
Як працює сортування злиттям?
Сортування злиттям — це популярний алгоритм сортування, відомий своєю ефективністю та стабільністю. Це слідує за розділяй і володарюй підхід до сортування заданого масиву елементів.
Ось покрокове пояснення того, як працює сортування злиттям:
- розділити: Розділіть список або масив рекурсивно на дві половини, поки його більше не можна буде розділити.
- перемогти: Кожен підмасив сортується окремо за допомогою алгоритму сортування злиттям.
- Об'єднати: Відсортовані підмасиви знову об’єднуються разом у відсортованому порядку. Процес триває, доки не буде об’єднано всі елементи з обох підмасивів.
Ілюстрація сортування злиттям:
Давайте відсортуємо масив або список [38, 27, 43, 10] за допомогою сортування злиттям
Рекомендована практика Спробуйте!Давайте подивимося на роботу наведеного вище прикладу:
розділити:
- [38, 27, 43, 10] поділяється на [38, 27 ] і [43, 10] .
- [38, 27] поділяється на [38] і [27] .
- [43, 10] поділяється на [43] і [10] .
перемогти:
- [38] вже відсортовано.
- [27] вже відсортовано.
- [43] вже відсортовано.
- [10] вже відсортовано.
Об'єднати:
- Об’єднати [38] і [27] отримати [27, 38] .
- Об’єднати [43] і [10] отримати [10,43] .
- Об’єднати [27, 38] і [10,43] щоб отримати остаточний відсортований список [10, 27, 38, 43]
Отже, відсортований список є [10, 27, 38, 43] .
Реалізація сортування злиттям:
C++ // C++ program for Merge Sort #include using namespace std; // Merges two subarrays of array[]. // First subarray is arr[begin..mid] // Second subarray is arr[mid+1..end] void merge(int array[], int const left, int const mid, int const right) { int const subArrayOne = mid - left + 1; int const subArrayTwo = right - mid; // Create temp arrays auto *leftArray = new int[subArrayOne], *rightArray = new int[subArrayTwo]; // Copy data to temp arrays leftArray[] and rightArray[] for (auto i = 0; i < subArrayOne; i++) leftArray[i] = array[left + i]; for (auto j = 0; j < subArrayTwo; j++) rightArray[j] = array[mid + 1 + j]; auto indexOfSubArrayOne = 0, indexOfSubArrayTwo = 0; int indexOfMergedArray = left; // Merge the temp arrays back into array[left..right] while (indexOfSubArrayOne < subArrayOne && indexOfSubArrayTwo < subArrayTwo) { if (leftArray[indexOfSubArrayOne] <= rightArray[indexOfSubArrayTwo]) { array[indexOfMergedArray] = leftArray[indexOfSubArrayOne]; indexOfSubArrayOne++; } else { array[indexOfMergedArray] = rightArray[indexOfSubArrayTwo]; indexOfSubArrayTwo++; } indexOfMergedArray++; } // Copy the remaining elements of // left[], if there are any while (indexOfSubArrayOne < subArrayOne) { array[indexOfMergedArray] = leftArray[indexOfSubArrayOne]; indexOfSubArrayOne++; indexOfMergedArray++; } // Copy the remaining elements of // right[], if there are any while (indexOfSubArrayTwo < subArrayTwo) { array[indexOfMergedArray] = rightArray[indexOfSubArrayTwo]; indexOfSubArrayTwo++; indexOfMergedArray++; } delete[] leftArray; delete[] rightArray; } // begin is for left index and end is right index // of the sub-array of arr to be sorted void mergeSort(int array[], int const begin, int const end) { if (begin>= закінчення) повернення; int mid = початок + (кінець - початок) / 2; mergeSort(масив, початок, середина); mergeSort(масив, середина + 1, кінець); злиття (масив, початок, середина, кінець); } // ДОПОМІЖНІ ФУНКЦІЇ // Функція друку масиву void printArray(int A[], int size) { for (int i = 0; i< size; i++) cout << A[i] << ' '; cout << endl; } // Driver code int main() { int arr[] = { 12, 11, 13, 5, 6, 7 }; int arr_size = sizeof(arr) / sizeof(arr[0]); cout << 'Given array is
'; printArray(arr, arr_size); mergeSort(arr, 0, arr_size - 1); cout << '
Sorted array is
'; printArray(arr, arr_size); return 0; } // This code is contributed by Mayank Tyagi // This code was revised by Joshua Estes> C // C program for Merge Sort #include #include // Merges two subarrays of arr[]. // First subarray is arr[l..m] // Second subarray is arr[m+1..r] void merge(int arr[], int l, int m, int r) { int i, j, k; int n1 = m - l + 1; int n2 = r - m; // Create temp arrays int L[n1], R[n2]; // Copy data to temp arrays L[] and R[] for (i = 0; i < n1; i++) L[i] = arr[l + i]; for (j = 0; j < n2; j++) R[j] = arr[m + 1 + j]; // Merge the temp arrays back into arr[l..r i = 0; j = 0; k = l; while (i < n1 && j < n2) { if (L[i] <= R[j]) { arr[k] = L[i]; i++; } else { arr[k] = R[j]; j++; } k++; } // Copy the remaining elements of L[], // if there are any while (i < n1) { arr[k] = L[i]; i++; k++; } // Copy the remaining elements of R[], // if there are any while (j < n2) { arr[k] = R[j]; j++; k++; } } // l is for left index and r is right index of the // sub-array of arr to be sorted void mergeSort(int arr[], int l, int r) { if (l < r) { int m = l + (r - l) / 2; // Sort first and second halves mergeSort(arr, l, m); mergeSort(arr, m + 1, r); merge(arr, l, m, r); } } // Function to print an array void printArray(int A[], int size) { int i; for (i = 0; i < size; i++) printf('%d ', A[i]); printf('
'); } // Driver code int main() { int arr[] = { 12, 11, 13, 5, 6, 7 }; int arr_size = sizeof(arr) / sizeof(arr[0]); printf('Given array is
'); printArray(arr, arr_size); mergeSort(arr, 0, arr_size - 1); printf('
Sorted array is
'); printArray(arr, arr_size); return 0; }> Java // Java program for Merge Sort import java.io.*; class MergeSort { // Merges two subarrays of arr[]. // First subarray is arr[l..m] // Second subarray is arr[m+1..r] void merge(int arr[], int l, int m, int r) { // Find sizes of two subarrays to be merged int n1 = m - l + 1; int n2 = r - m; // Create temp arrays int L[] = new int[n1]; int R[] = new int[n2]; // Copy data to temp arrays for (int i = 0; i < n1; ++i) L[i] = arr[l + i]; for (int j = 0; j < n2; ++j) R[j] = arr[m + 1 + j]; // Merge the temp arrays // Initial indices of first and second subarrays int i = 0, j = 0; // Initial index of merged subarray array int k = l; while (i < n1 && j < n2) { if (L[i] <= R[j]) { arr[k] = L[i]; i++; } else { arr[k] = R[j]; j++; } k++; } // Copy remaining elements of L[] if any while (i < n1) { arr[k] = L[i]; i++; k++; } // Copy remaining elements of R[] if any while (j < n2) { arr[k] = R[j]; j++; k++; } } // Main function that sorts arr[l..r] using // merge() void sort(int arr[], int l, int r) { if (l < r) { // Find the middle point int m = l + (r - l) / 2; // Sort first and second halves sort(arr, l, m); sort(arr, m + 1, r); // Merge the sorted halves merge(arr, l, m, r); } } // A utility function to print array of size n static void printArray(int arr[]) { int n = arr.length; for (int i = 0; i < n; ++i) System.out.print(arr[i] + ' '); System.out.println(); } // Driver code public static void main(String args[]) { int arr[] = { 12, 11, 13, 5, 6, 7 }; System.out.println('Given array is'); printArray(arr); MergeSort ob = new MergeSort(); ob.sort(arr, 0, arr.length - 1); System.out.println('
Sorted array is'); printArray(arr); } } /* This code is contributed by Rajat Mishra */> Python # Merges two subarrays of array[]. # First subarray is arr[left..mid] # Second subarray is arr[mid+1..right] def merge(array, left, mid, right): subArrayOne = mid - left + 1 subArrayTwo = right - mid # Create temp arrays leftArray = [0] * subArrayOne rightArray = [0] * subArrayTwo # Copy data to temp arrays leftArray[] and rightArray[] for i in range(subArrayOne): leftArray[i] = array[left + i] for j in range(subArrayTwo): rightArray[j] = array[mid + 1 + j] indexOfSubArrayOne = 0 # Initial index of first sub-array indexOfSubArrayTwo = 0 # Initial index of second sub-array indexOfMergedArray = left # Initial index of merged array # Merge the temp arrays back into array[left..right] while indexOfSubArrayOne < subArrayOne and indexOfSubArrayTwo < subArrayTwo: if leftArray[indexOfSubArrayOne] <= rightArray[indexOfSubArrayTwo]: array[indexOfMergedArray] = leftArray[indexOfSubArrayOne] indexOfSubArrayOne += 1 else: array[indexOfMergedArray] = rightArray[indexOfSubArrayTwo] indexOfSubArrayTwo += 1 indexOfMergedArray += 1 # Copy the remaining elements of left[], if any while indexOfSubArrayOne < subArrayOne: array[indexOfMergedArray] = leftArray[indexOfSubArrayOne] indexOfSubArrayOne += 1 indexOfMergedArray += 1 # Copy the remaining elements of right[], if any while indexOfSubArrayTwo < subArrayTwo: array[indexOfMergedArray] = rightArray[indexOfSubArrayTwo] indexOfSubArrayTwo += 1 indexOfMergedArray += 1 # begin is for left index and end is right index # of the sub-array of arr to be sorted def mergeSort(array, begin, end): if begin>= кінець: повернути середину = початок + (кінець - початок) // 2 mergeSort(масив, початок, середина) mergeSort(масив, середина + 1, кінець) merge(масив, початок, середина, кінець) # Функція друку масиву def printArray(array, size): for i in range(size): print(array[i], end=' ') print() # Код драйвера if __name__ == '__main__': arr = [12 , 11, 13, 5, 6, 7] arr_size = len(arr) print('Даний масив є') printArray(arr, arr_size) mergeSort(arr, 0, arr_size - 1) print('
Відсортований масив is') printArray(arr, arr_size)> C# // C# program for Merge Sort using System; class MergeSort { // Merges two subarrays of []arr. // First subarray is arr[l..m] // Second subarray is arr[m+1..r] void merge(int[] arr, int l, int m, int r) { // Find sizes of two // subarrays to be merged int n1 = m - l + 1; int n2 = r - m; // Create temp arrays int[] L = new int[n1]; int[] R = new int[n2]; int i, j; // Copy data to temp arrays for (i = 0; i < n1; ++i) L[i] = arr[l + i]; for (j = 0; j < n2; ++j) R[j] = arr[m + 1 + j]; // Merge the temp arrays // Initial indexes of first // and second subarrays i = 0; j = 0; // Initial index of merged // subarray array int k = l; while (i < n1 && j < n2) { if (L[i] <= R[j]) { arr[k] = L[i]; i++; } else { arr[k] = R[j]; j++; } k++; } // Copy remaining elements // of L[] if any while (i < n1) { arr[k] = L[i]; i++; k++; } // Copy remaining elements // of R[] if any while (j < n2) { arr[k] = R[j]; j++; k++; } } // Main function that // sorts arr[l..r] using // merge() void sort(int[] arr, int l, int r) { if (l < r) { // Find the middle point int m = l + (r - l) / 2; // Sort first and second halves sort(arr, l, m); sort(arr, m + 1, r); // Merge the sorted halves merge(arr, l, m, r); } } // A utility function to // print array of size n static void printArray(int[] arr) { int n = arr.Length; for (int i = 0; i < n; ++i) Console.Write(arr[i] + ' '); Console.WriteLine(); } // Driver code public static void Main(String[] args) { int[] arr = { 12, 11, 13, 5, 6, 7 }; Console.WriteLine('Given array is'); printArray(arr); MergeSort ob = new MergeSort(); ob.sort(arr, 0, arr.Length - 1); Console.WriteLine('
Sorted array is'); printArray(arr); } } // This code is contributed by Princi Singh> Javascript // JavaScript program for Merge Sort // Merges two subarrays of arr[]. // First subarray is arr[l..m] // Second subarray is arr[m+1..r] function merge(arr, l, m, r) { var n1 = m - l + 1; var n2 = r - m; // Create temp arrays var L = new Array(n1); var R = new Array(n2); // Copy data to temp arrays L[] and R[] for (var i = 0; i < n1; i++) L[i] = arr[l + i]; for (var j = 0; j < n2; j++) R[j] = arr[m + 1 + j]; // Merge the temp arrays back into arr[l..r] // Initial index of first subarray var i = 0; // Initial index of second subarray var j = 0; // Initial index of merged subarray var k = l; while (i < n1 && j < n2) { if (L[i] <= R[j]) { arr[k] = L[i]; i++; } else { arr[k] = R[j]; j++; } k++; } // Copy the remaining elements of // L[], if there are any while (i < n1) { arr[k] = L[i]; i++; k++; } // Copy the remaining elements of // R[], if there are any while (j < n2) { arr[k] = R[j]; j++; k++; } } // l is for left index and r is // right index of the sub-array // of arr to be sorted function mergeSort(arr,l, r){ if(l>=r){ повернення; } var m =l+ parseInt((r-l)/2); mergeSort(arr,l,m); mergeSort(arr,m+1,r); злиття (arr,l,m,r); } // Функція друку масиву function printArray( A, size) { for (var i = 0; i< size; i++) console.log( A[i] + ' '); } var arr = [ 12, 11, 13, 5, 6, 7 ]; var arr_size = arr.length; console.log( 'Given array is '); printArray(arr, arr_size); mergeSort(arr, 0, arr_size - 1); console.log( 'Sorted array is '); printArray(arr, arr_size); // This code is contributed by SoumikMondal> PHP /* PHP recursive program for Merge Sort */ // Merges two subarrays of arr[]. // First subarray is arr[l..m] // Second subarray is arr[m+1..r] function merge(&$arr, $l, $m, $r) { $n1 = $m - $l + 1; $n2 = $r - $m; // Create temp arrays $L = array(); $R = array(); // Copy data to temp arrays L[] and R[] for ($i = 0; $i < $n1; $i++) $L[$i] = $arr[$l + $i]; for ($j = 0; $j < $n2; $j++) $R[$j] = $arr[$m + 1 + $j]; // Merge the temp arrays back into arr[l..r] $i = 0; $j = 0; $k = $l; while ($i < $n1 && $j < $n2) { if ($L[$i] <= $R[$j]) { $arr[$k] = $L[$i]; $i++; } else { $arr[$k] = $R[$j]; $j++; } $k++; } // Copy the remaining elements of L[], // if there are any while ($i < $n1) { $arr[$k] = $L[$i]; $i++; $k++; } // Copy the remaining elements of R[], // if there are any while ($j < $n2) { $arr[$k] = $R[$j]; $j++; $k++; } } // l is for left index and r is right index of the // sub-array of arr to be sorted function mergeSort(&$arr, $l, $r) { if ($l < $r) { $m = $l + (int)(($r - $l) / 2); // Sort first and second halves mergeSort($arr, $l, $m); mergeSort($arr, $m + 1, $r); merge($arr, $l, $m, $r); } } // Function to print an array function printArray($A, $size) { for ($i = 0; $i < $size; $i++) echo $A[$i].' '; echo '
'; } // Driver code $arr = array(12, 11, 13, 5, 6, 7); $arr_size = sizeof($arr); echo 'Given array is
'; printArray($arr, $arr_size); mergeSort($arr, 0, $arr_size - 1); echo '
Sorted array is
'; printArray($arr, $arr_size); return 0; //This code is contributed by Susobhan Akhuli ?>> Вихід
Given array is 12 11 13 5 6 7 Sorted array is 5 6 7 11 12 13>
Аналіз складності сортування злиттям:
Часова складність:
- Найкращий випадок: O(n log n), коли масив уже відсортовано або майже відсортовано.
- Середній випадок: O(n log n), коли масив упорядкований у випадковому порядку.
- Найгірший випадок: O(n log n), коли масив сортується у зворотному порядку.
Космічна складність: O(n), потрібен додатковий простір для тимчасового масиву, який використовується під час злиття.
Переваги сортування злиттям:
- Стабільність : сортування злиттям є стабільним алгоритмом сортування, що означає, що він підтримує відносний порядок рівних елементів у вхідному масиві.
- Гарантована продуктивність у найгіршому випадку: Сортування злиттям має найгіршу часову складність O(N logN) , що означає, що він добре працює навіть на великих наборах даних.
- Простий у виконанні: Підхід «розділяй і володарюй» є простим.
Недолік сортування злиттям:
- Складність простору: Сортування злиттям вимагає додаткової пам’яті для зберігання об’єднаних підмасивів під час процесу сортування.
- Не на місці: Сортування злиттям не є алгоритмом сортування на місці, що означає, що для зберігання відсортованих даних потрібна додаткова пам’ять. Це може бути недоліком у програмах, де споживання пам’яті викликає занепокоєння.
Застосування сортування злиттям:
- Сортування великих наборів даних
- Зовнішнє сортування (коли набір даних занадто великий, щоб поміститися в пам’ять)
- Підрахунок інверсій (підрахунок кількості інверсій в масиві)
- Знаходження медіани масиву
Швидкі посилання:
- Останні статті про сортування злиттям
- Найпопулярніші питання та проблеми для співбесіди
- Тренувальні задачі на тему «Алгоритм сортування».
- Тест із сортування злиттям