Advertisement
karbaev

mergesort

Feb 29th, 2016
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.94 KB | None | 0 0
  1. /* Объединение двух половинок arr[l..m] и arr[m+1..r] массива arr[] */
  2. void merge(int arr[], int l, int m, int r)
  3. {
  4.     int i, j, k;
  5.     int n1 = m - l + 1;
  6.     int n2 =  r - m;
  7.  
  8.     /* временные массивы */
  9.     int L[n1], R[n2];
  10.  
  11.     /* заполнение временных массивов */
  12.     for(i = 0; i < n1; i++)
  13.         L[i] = arr[l + i];
  14.     for(j = 0; j < n2; j++)
  15.         R[j] = arr[m + 1+ j];
  16.  
  17.     /* Слияние временных массивов в arr[l..r]*/
  18.     i = 0;
  19.     j = 0;
  20.     k = l;
  21.     while (i < n1 && j < n2)
  22.     {
  23.         if (L[i] <= R[j])
  24.         {
  25.             arr[k] = L[i];
  26.             i++;
  27.         }
  28.         else
  29.         {
  30.             arr[k] = R[j];
  31.             j++;
  32.         }
  33.         k++;
  34.     }
  35.  
  36.     /* Копирование оставшихся элементов L[], если есть */
  37.     while (i < n1)
  38.     {
  39.         arr[k] = L[i];
  40.         i++;
  41.         k++;
  42.     }
  43.  
  44.     /* Копирование оставшихся элементов R[], если есть */
  45.     while (j < n2)
  46.     {
  47.         arr[k] = R[j];
  48.         j++;
  49.         k++;
  50.     }
  51. }
  52.  
  53. //рекурсивное разбиение массива
  54. void mergeSort(int arr[], int l, int r)
  55. {
  56.     if (l < r)
  57.     {
  58.         int m = l+(r-l)/2; //тоже что и (l+r)/2, для избежания переполнения
  59.         mergeSort(arr, l, m);
  60.         mergeSort(arr, m+1, r);
  61.         merge(arr, l, m, r);
  62.     }
  63. }
  64.  
  65.  
  66. void printArray(int A[], int size)
  67. {
  68.     int i;
  69.     for (i=0; i < size; i++)
  70.         printf("%d ", A[i]);
  71.     printf("\n");
  72. }
  73.  
  74. int main()
  75. {
  76.     int arr[] = {12, 11, 13, 5, 6, 7};
  77.     int arr_size = sizeof(arr)/sizeof(arr[0]);
  78.  
  79.     printf("Given array is \n");
  80.     printArray(arr, arr_size);
  81.  
  82.     mergeSort(arr, 0, arr_size - 1);
  83.  
  84.     printf("\nSorted array is \n");
  85.     printArray(arr, arr_size);
  86.     return 0;
  87. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement