Advertisement
Guest User

Merge Sort for 2D array

a guest
Jun 27th, 2018
344
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.09 KB | None | 0 0
  1. // https://www.geeksforgeeks.org/merge-sort/
  2. /* C program for Merge Sort */
  3. /* C The same function for 2D array */
  4.  
  5. #include<stdlib.h>
  6. #include<stdio.h>
  7.  
  8.  #define HEIGHT   2
  9.  #define WIDTH    4
  10.  
  11. // Merges two subarrays of arr[].
  12. // First subarray is arr[l..m]
  13. // Second subarray is arr[m+1..r]
  14. void merge(int arr[], int l, int m, int r)
  15. {
  16.     int i, j, k;
  17.     int n1 = m - l + 1;
  18.     int n2 =  r - m;
  19.  
  20.     /* create temp arrays */
  21.     int *L = (int *)malloc(sizeof(int) * n1);
  22.     int *R = (int *)malloc(sizeof(int) * n2);
  23.  
  24.     /* Copy data to temp arrays L[] and R[] */
  25.     for (i = 0; i < n1; i++)
  26.         L[i] = arr[l + i];
  27.     for (j = 0; j < n2; j++)
  28.         R[j] = arr[m + 1+ j];
  29.  
  30.     /* Merge the temp arrays back into arr[l..r]*/
  31.     i = 0; // Initial index of first subarray
  32.     j = 0; // Initial index of second subarray
  33.     k = l; // Initial index of merged subarray
  34.     while (i < n1 && j < n2)
  35.     {
  36.         if (L[i] <= R[j])
  37.         {
  38.             arr[k] = L[i];
  39.             i++;
  40.         }
  41.         else
  42.         {
  43.             arr[k] = R[j];
  44.             j++;
  45.         }
  46.         k++;
  47.     }
  48.  
  49.     /* Copy the remaining elements of L[], if there
  50.        are any */
  51.     while (i < n1)
  52.     {
  53.         arr[k] = L[i];
  54.         i++;
  55.         k++;
  56.     }
  57.  
  58.     /* Copy the remaining elements of R[], if there
  59.        are any */
  60.     while (j < n2)
  61.     {
  62.         arr[k] = R[j];
  63.         j++;
  64.         k++;
  65.     }
  66.  
  67.     free(L);
  68.     free(R);
  69. }
  70.  
  71. /* l is for left index and r is right index of the
  72.    sub-array of arr to be sorted */
  73. void mergeSort(int arr[], int l, int r)
  74. {
  75.     if (l < r)
  76.     {
  77.         // Same as (l+r)/2, but avoids overflow for
  78.         // large l and h
  79.         int m = l+(r-l)/2;
  80.  
  81.         // Sort first and second halves
  82.         mergeSort(arr, l, m);
  83.         mergeSort(arr, m+1, r);
  84.  
  85.         merge(arr, l, m, r);
  86.     }
  87. }
  88.  
  89. /* UTILITY FUNCTIONS */
  90. /* Function to print an array */
  91. void printArray(int A[], int size)
  92. {
  93.     int i;
  94.     for (i=0; i < size; i++)
  95.         printf("%d ", A[i]);
  96.     printf("\n");
  97. }
  98.  
  99. /* Function to print an 2D array */
  100. void print2DArray(int A[HEIGHT][WIDTH])
  101. {
  102.     int i, j;
  103.     for (i=0; i < HEIGHT; i++)
  104.     {
  105.         for (j=0; j < WIDTH; j++)
  106.         {
  107.             printf("%-5d ", A[i][j]);
  108.         }
  109.         printf("\n");
  110.     }
  111.     printf("\n");
  112. }
  113.  
  114. /* Driver program to test above functions */
  115. int main()
  116. {
  117.     int arr[] = {12, 11, 13, 5, 6, 7};
  118.     int arr2D[HEIGHT][WIDTH] = {
  119.         { -3  , 34 , 5   , 90 },
  120.         { -40 , 17 , 100 , 0  },
  121.     };
  122.     int arr_size = 0, arr2D_size = 0;
  123.  
  124.     arr_size = sizeof(arr)/sizeof(arr[0]);
  125.     printf("arr_size:  %d\n\n", arr_size);
  126.  
  127.     printf("Given 1D array is \n");
  128.     printArray(arr, arr_size);
  129.  
  130.     mergeSort(arr, 0, arr_size - 1);
  131.  
  132.     printf("\nSorted 1D array is \n");
  133.     printArray(arr, arr_size);
  134.  
  135.     /// ******** ///
  136.     printf("\n\n ..... \n\n\n");
  137.  
  138.     arr2D_size = HEIGHT * WIDTH;
  139.     printf("arr2D_size: %d\n\n", arr2D_size);
  140.     printf("Given 2D array is \n");
  141.     print2DArray(arr2D);
  142.  
  143.     mergeSort(*arr2D, 0, arr2D_size - 1);
  144.  
  145.     printf("\nSorted 2D array is \n");
  146.     print2DArray(arr2D);
  147. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement