Med tanke på en uppsättning element hitta vilken permutation av dessa element skulle resultera i värsta fall av sammanslagning.
Asymptotiskt sammanslagningssortering tar alltid o (n log n) tid men de fall som kräver fler jämförelser tar i allmänhet mer tid i praktiken. Vi måste i princip hitta en permutation av inmatningselement som skulle leda till maximalt antal jämförelser när de sorteras med en typisk sammanslagningssorteringsalgoritm.
Exempel:
Consider the below set of elements
{1 2 3 4 5 6 7 8 9 10 11 12
13 14 15 16}
Below permutation of the set causes 153
comparisons.
{1 9 5 13 3 11 7 15 2 10 6
14 4 12 8 16}
And an already sorted permutation causes
30 comparisons.
Hur får jag nu inmatning av värsta fall för sammanslagning för en ingångsuppsättning?
Låter oss försöka bygga upp matrisen i botten uppåt
Låt den sorterade arrayen vara {12345678}.
För att generera det värsta fallet av sammanslagning sortera sammanslagningsoperationen som resulterade i ovan sorterad matris resultera i maximala jämförelser. För att göra det bör den vänstra och högra under array som är involverad i sammanslagning lagra alternativa element med sorterad matris. dvs. vänster sub-array bör vara {1357} och höger under array bör vara {2468}. Nu kommer varje element i matrisen att jämföras åtminstone en gång och det kommer att resultera i maximala jämförelser. Vi tillämpar också samma logik för vänster och höger underlag. För array {1357} kommer det värsta fallet att vara när det är vänster och höger under array är {15} respektive {37} och för array {2468} Det värsta fallet kommer att inträffa för {24} respektive {68}.
Komplett algoritm -
GenerateWorstcase (arr [])
- Skapa två hjälpmatriser till vänster och höger och lagra alternativa matriselement i dem.
- CALL GENERATEWORSTCASE för vänster Subarray: GenerateWorstcase (vänster)
- CALL GENERATEWORSTCASE FÖR RIGHT SUBARRAY: GenerateWorstcase (till höger)
- Kopiera alla element i vänster och höger underlag tillbaka till original matris.
Nedan är implementeringen av idén
katrina kaifC++
// C++ program to generate Worst Case // of Merge Sort #include using namespace std; // Function to print an array void printArray(int A[] int size) { for(int i = 0; i < size; i++) { cout << A[i] << ' '; } cout << endl; } // Function to join left and right subarray int join(int arr[] int left[] int right[] int l int m int r) { int i; for(i = 0; i <= m - l; i++) arr[i] = left[i]; for(int j = 0; j < r - m; j++) { arr[i + j] = right[j]; } } // Function to store alternate elements in // left and right subarray int split(int arr[] int left[] int right[] int l int m int r) { for(int i = 0; i <= m - l; i++) left[i] = arr[i * 2]; for(int i = 0; i < r - m; i++) right[i] = arr[i * 2 + 1]; } // Function to generate Worst Case // of Merge Sort int generateWorstCase(int arr[] int l int r) { if (l < r) { int m = l + (r - l) / 2; // Create two auxiliary arrays int left[m - l + 1]; int right[r - m]; // Store alternate array elements // in left and right subarray split(arr left right l m r); // Recurse first and second halves generateWorstCase(left l m); generateWorstCase(right m + 1 r); // Join left and right subarray join(arr left right l m r); } } // Driver code int main() { // Sorted array int arr[] = { 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 }; int n = sizeof(arr) / sizeof(arr[0]); cout << 'Sorted array is n'; printArray(arr n); // Generate Worst Case of Merge Sort generateWorstCase(arr 0 n - 1); cout << 'nInput array that will result ' << 'in worst case of merge sort is n'; printArray(arr n); return 0; } // This code is contributed by Mayank Tyagi
C // C program to generate Worst Case of Merge Sort #include #include // Function to print an array void printArray(int A[] int size) { for (int i = 0; i < size; i++) printf('%d ' A[i]); printf('n'); } // Function to join left and right subarray int join(int arr[] int left[] int right[] int l int m int r) { int i; // Used in second loop for (i = 0; i <= m - l; i++) arr[i] = left[i]; for (int j = 0; j < r - m; j++) arr[i + j] = right[j]; } // Function to store alternate elements in left // and right subarray int split(int arr[] int left[] int right[] int l int m int r) { for (int i = 0; i <= m - l; i++) left[i] = arr[i * 2]; for (int i = 0; i < r - m; i++) right[i] = arr[i * 2 + 1]; } // Function to generate Worst Case of Merge Sort int generateWorstCase(int arr[] int l int r) { if (l < r) { int m = l + (r - l) / 2; // create two auxiliary arrays int left[m - l + 1]; int right[r - m]; // Store alternate array elements in left // and right subarray split(arr left right l m r); // Recurse first and second halves generateWorstCase(left l m); generateWorstCase(right m + 1 r); // join left and right subarray join(arr left right l m r); } } // Driver code int main() { // Sorted array int arr[] = { 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 }; int n = sizeof(arr) / sizeof(arr[0]); printf('Sorted array is n'); printArray(arr n); // generate Worst Case of Merge Sort generateWorstCase(arr 0 n - 1); printf('nInput array that will result in ' 'worst case of merge sort is n'); printArray(arr n); return 0; }
Java // Java program to generate Worst Case of Merge Sort import java.util.Arrays; class GFG { // Function to join left and right subarray static void join(int arr[] int left[] int right[] int l int m int r) { int i; for (i = 0; i <= m - l; i++) arr[i] = left[i]; for (int j = 0; j < r - m; j++) arr[i + j] = right[j]; } // Function to store alternate elements in left // and right subarray static void split(int arr[] int left[] int right[] int l int m int r) { for (int i = 0; i <= m - l; i++) left[i] = arr[i * 2]; for (int i = 0; i < r - m; i++) right[i] = arr[i * 2 + 1]; } // Function to generate Worst Case of Merge Sort static void generateWorstCase(int arr[] int l int r) { if (l < r) { int m = l + (r - l) / 2; // create two auxiliary arrays int[] left = new int[m - l + 1]; int[] right = new int[r - m]; // Store alternate array elements in left // and right subarray split(arr left right l m r); // Recurse first and second halves generateWorstCase(left l m); generateWorstCase(right m + 1 r); // join left and right subarray join(arr left right l m r); } } // driver program public static void main (String[] args) { // sorted array int arr[] = { 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 }; int n = arr.length; System.out.println('Sorted array is'); System.out.println(Arrays.toString(arr)); // generate Worst Case of Merge Sort generateWorstCase(arr 0 n - 1); System.out.println('nInput array that will result in n'+ 'worst case of merge sort is n'); System.out.println(Arrays.toString(arr)); } } // Contributed by Pramod Kumar
Python # Python program to generate Worst Case of Merge Sort # Function to join left and right subarray def join(arr left right l m r): i = 0; for i in range(m-l+1): arr[i] = left[i]; i+=1; for j in range(r-m): arr[i + j] = right[j]; # Function to store alternate elements in left # and right subarray def split(arr left right l m r): for i in range(m-l+1): left[i] = arr[i * 2]; for i in range(r-m): right[i] = arr[i * 2 + 1]; # Function to generate Worst Case of Merge Sort def generateWorstCase(arr l r): if (l < r): m = l + (r - l) // 2; # create two auxiliary arrays left = [0 for i in range(m - l + 1)]; right = [0 for i in range(r-m)]; # Store alternate array elements in left # and right subarray split(arr left right l m r); # Recurse first and second halves generateWorstCase(left l m); generateWorstCase(right m + 1 r); # join left and right subarray join(arr left right l m r); # driver program if __name__ == '__main__': # sorted array arr = [1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16]; n = len(arr); print('Sorted array is'); print(arr); # generate Worst Case of Merge Sort generateWorstCase(arr 0 n - 1); print('nInput array that will result in n' + 'worst case of merge sort is '); print(arr); # This code contributed by shikhasingrajput
C# // C# program to generate Worst Case of // Merge Sort using System; class GFG { // Function to join left and right subarray static void join(int []arr int []left int []right int l int m int r) { int i; for (i = 0; i <= m - l; i++) arr[i] = left[i]; for (int j = 0; j < r - m; j++) arr[i + j] = right[j]; } // Function to store alternate elements in // left and right subarray static void split(int []arr int []left int []right int l int m int r) { for (int i = 0; i <= m - l; i++) left[i] = arr[i * 2]; for (int i = 0; i < r - m; i++) right[i] = arr[i * 2 + 1]; } // Function to generate Worst Case of // Merge Sort static void generateWorstCase(int []arr int l int r) { if (l < r) { int m = l + (r - l) / 2; // create two auxiliary arrays int[] left = new int[m - l + 1]; int[] right = new int[r - m]; // Store alternate array elements // in left and right subarray split(arr left right l m r); // Recurse first and second halves generateWorstCase(left l m); generateWorstCase(right m + 1 r); // join left and right subarray join(arr left right l m r); } } // driver program public static void Main () { // sorted array int []arr = { 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 }; int n = arr.Length; Console.Write('Sorted array isn'); for(int i = 0; i < n; i++) Console.Write(arr[i] + ' '); // generate Worst Case of Merge Sort generateWorstCase(arr 0 n - 1); Console.Write('nInput array that will ' + 'result in n worst case of' + ' merge sort is n'); for(int i = 0; i < n; i++) Console.Write(arr[i] + ' '); } } // This code is contributed by Smitha
JavaScript <script> // javascript program to generate Worst Case // of Merge Sort // Function to print an array function printArray(Asize) { for(let i = 0; i < size; i++) { document.write(A[i] + ' '); } } // Function to join left and right subarray function join(arrleftrightlmr) { let i; for(i = 0; i <= m - l; i++) arr[i] = left[i]; for(let j = 0; j < r - m; j++) { arr[i + j] = right[j]; } } // Function to store alternate elements in // left and right subarray function split(arrleftrightlmr) { for(let i = 0; i <= m - l; i++) left[i] = arr[i * 2]; for(let i = 0; i < r - m; i++) right[i] = arr[i * 2 + 1]; } // Function to generate Worst Case // of Merge Sort function generateWorstCase(arrlr) { if (l < r) { let m = l + parseInt((r - l) / 2 10); // Create two auxiliary arrays let left = new Array(m - l + 1); let right = new Array(r - m); left.fill(0); right.fill(0); // Store alternate array elements // in left and right subarray split(arr left right l m r); // Recurse first and second halves generateWorstCase(left l m); generateWorstCase(right m + 1 r); // Join left and right subarray join(arr left right l m r); } } let arr = [1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ]; let n = arr.length; document.write('Sorted array is' + ''); printArray(arr n); // Generate Worst Case of Merge Sort generateWorstCase(arr 0 n - 1); document.write('' + 'Input array that will result ' + 'in worst case of merge sort is' + ''); printArray(arr n); // This code is contributed by vaibhavrabadiya117. </script>
Produktion:
Sorted array is
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
Input array that will result in worst
case of merge sort is
1 9 5 13 3 11 7 15 2 10 6 14 4 12 8 16
Tidskomplexitet: o (n logn)
Hjälputrymme: o (n)
Referenser - Överflöd