Apvienot kārtošanu ir šķirošanas algoritms, kas seko sadali un valdi pieeja. Tas darbojas, rekursīvi sadalot ievades masīvu mazākos apakšmasīvos un kārtojot šos apakšmasīvus, pēc tam apvienojot tos kopā, lai iegūtu sakārtoto masīvu.
Vienkārši izsakoties, mēs varam teikt, ka process sapludināt kārtot ir sadalīt masīvu divās daļās, kārtot katru pusi un pēc tam atkal apvienot sakārtotās puses. Šo procesu atkārto, līdz viss masīvs ir sakārtots.

Sapludināt kārtošanas algoritmu
kā java pārvērst virkni par veselu skaitli
Kā darbojas sapludināšanas kārtošana?
Sapludināšanas kārtošana ir populārs šķirošanas algoritms, kas pazīstams ar savu efektivitāti un stabilitāti. No tā izriet sadali un valdi pieeja noteikta elementu masīva kārtošanai.
Tālāk ir sniegts detalizēts skaidrojums par sapludināšanas kārtošanas darbību.
- Dalīt: Sadaliet sarakstu vai masīvu rekursīvi divās daļās, līdz to vairs nevar sadalīt.
- Iekarot: Katrs apakšmasīvs tiek kārtots atsevišķi, izmantojot sapludināšanas kārtošanas algoritmu.
- Apvienot: Sakārtotās apakšgrupas tiek atkal apvienotas sakārtotā secībā. Process turpinās, līdz visi elementi no abām apakšgrupām ir apvienoti.
Sapludināšanas kārtošanas ilustrācija:
Sakārtosim masīvu vai sarakstu [38, 27, 43, 10] izmantojot sapludināšanas kārtošanu
Ieteicamā prakse Izmēģiniet to!Apskatīsim iepriekš minētā piemēra darbību:
Dalīt:
- [38, 27, 43, 10] ir sadalīts [38, 27 ] un [43, 10] .
- [38, 27] ir sadalīts [38] un [27] .
- [43, 10] ir sadalīts [43] un [10] .
Iekarot:
- [38] ir jau sakārtots.
- [27] ir jau sakārtots.
- [43] ir jau sakārtots.
- [10] ir jau sakārtots.
Apvienot:
- Apvienot [38] un [27] dabūt [27, 38] .
- Apvienot [43] un [10] dabūt [10.43] .
- Apvienot [27, 38] un [10.43] lai iegūtu galīgo sakārtoto sarakstu [10, 27, 38, 43]
Tāpēc sakārtotais saraksts ir [10, 27, 38, 43] .
Sapludināšanas kārtošanas ieviešana:
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>= beigas) atgriešanās; int vidus = sākums + (beigas - sākums) / 2; mergeSort(masīvs, sākums, vidus); mergeSort(masīvs, vidus + 1, beigas); sapludināt(masīvs, sākums, vidus, beigas); } // LIETDERĪBAS FUNKCIJAS // Funkcija masīva drukāšanai 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>= beigas: return mid = sākums + (beigas - sākums) // 2 mergeSort(masīvs, sākums, vidus) mergeSort(masīvs, vidus + 1, beigas) sapludināt(masīvs, sākums, vidus, beigas) # Funkcija masīva drukāšanai def printArray(masīvs, izmērs): i diapazonā(izmērs): print(masīvs[i], end=' ') print() # Draivera kods if __name__ == '__main__': arr = [12 , 11, 13, 5, 6, 7] arr_size = len(arr) print('Dotais masīvs ir') printArray(arr, arr_size) mergeSort(arr, 0, arr_size - 1) print('
Kārtots masīvs 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){ atgriešanās; } var m =l+ parseInt((r-l)/2); mergeSort(arr,l,m); mergeSort(arr,m+1,r); sapludināt(arr,l,m,r); } // Funkcija masīva funkcijas drukāšanai 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 ?>>>
Izvade Laika sarežģītība: - Labākais gadījums: O(n log n), kad masīvs jau ir sakārtots vai gandrīz sakārtots.
- Vidējais gadījums: O(n log n), kad masīvs ir nejauši sakārtots.
- Sliktākajā gadījumā: O(n log n), kad masīvs ir sakārtots apgrieztā secībā.
Kosmosa sarežģītība: O(n), ir nepieciešama papildu vieta pagaidu masīvam, ko izmanto sapludināšanas laikā.
virkņu masīva izveide Java
Sapludināšanas kārtošanas priekšrocības:
- Stabilitāte : sapludināšanas kārtošana ir stabils kārtošanas algoritms, kas nozīmē, ka tas saglabā vienādu elementu relatīvo secību ievades masīvā.
- Garantēta sliktākā gadījuma veiktspēja: Sapludināšanas kārtošanai ir sliktākā gadījuma laika sarežģītība O(N logN) , kas nozīmē, ka tas labi darbojas pat lielās datu kopās.
- Vienkārši īstenojams: Skaldi un valdi pieeja ir vienkārša.
Sapludināšanas kārtošanas trūkums:
- Telpas sarežģītība: Sapludināšanas kārtošanai ir nepieciešama papildu atmiņa, lai kārtošanas procesa laikā saglabātu apvienotos apakšmasīvus.
- Nav uz vietas: Sapludināšanas kārtošana nav kārtošanas algoritms vietā, kas nozīmē, ka tai ir nepieciešama papildu atmiņa, lai saglabātu sakārtotos datus. Tas var būt trūkums lietojumprogrammās, kurās atmiņas lietojums rada bažas.
Sapludināšanas kārtošanas lietojumprogrammas:
- Lielu datu kopu kārtošana
- Ārējā kārtošana (ja datu kopa ir pārāk liela, lai ietilptu atmiņā)
- Inversiju skaitīšana (inversiju skaita skaitīšana masīvā)
- Masīva mediānas atrašana
Ātrās saites:
- Jaunākie raksti par sapludināšanas kārtošanu
- Populārākie interviju jautājumi un problēmas
- Praktizējiet kārtošanas algoritma problēmas
- Viktorīna par sapludināšanas kārtošanu