dzungchaos

CTDL&TT: Merge Sort

Jul 5th, 2020
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.21 KB | None | 0 0
  1. #include<stdlib.h>
  2. #include<stdio.h>
  3.  
  4. // Gộp hai mảng con arr[l...m] và arr[m+1..r]
  5. void merge(int arr[], int l, int m, int r)
  6. {
  7.     int i, j, k;
  8.     int n1 = m - l + 1;
  9.     int n2 =  r - m;
  10.  
  11.     /* Tạo các mảng tạm */
  12.     int L[n1], R[n2];
  13.  
  14.     /* Copy dữ liệu sang các mảng tạm */
  15.     for (i = 0; i < n1; i++)
  16.         L[i] = arr[l + i];
  17.     for (j = 0; j < n2; j++)
  18.         R[j] = arr[m + 1+ j];
  19.  
  20.     /* Gộp hai mảng tạm vừa rồi vào mảng arr*/
  21.     i = 0; // Khởi tạo chỉ số bắt đầu của mảng con đầu tiên
  22.     j = 0; // Khởi tạo chỉ số bắt đầu của mảng con thứ hai
  23.     k = l; // IKhởi tạo chỉ số bắt đầu của mảng lưu kết quả
  24.     while (i < n1 && j < n2)
  25.     {
  26.         if (L[i] <= R[j])
  27.         {
  28.             arr[k] = L[i];
  29.             i++;
  30.         }
  31.         else
  32.         {
  33.             arr[k] = R[j];
  34.             j++;
  35.         }
  36.         k++;
  37.     }
  38.  
  39.     /* Copy các phần tử còn lại của mảng L vào arr nếu có */
  40.     while (i < n1)
  41.     {
  42.         arr[k] = L[i];
  43.         i++;
  44.         k++;
  45.     }
  46.  
  47.     /* Copy các phần tử còn lại của mảng R vào arr nếu có */
  48.     while (j < n2)
  49.     {
  50.         arr[k] = R[j];
  51.         j++;
  52.         k++;
  53.     }
  54. }
  55.  
  56. /* l là chỉ số trái và r là chỉ số phải của mảng cần được sắp xếp */
  57. void mergeSort(int arr[], int l, int r)
  58. {
  59.     if (l < r)
  60.     {
  61.         // Tương tự (l+r)/2, nhưng cách này tránh tràn số khi l và r lớn
  62.         int m = l+(r-l)/2;
  63.  
  64.         // Gọi hàm đệ quy tiếp tục chia đôi từng nửa mảng
  65.         mergeSort(arr, l, m);
  66.         mergeSort(arr, m+1, r);
  67.  
  68.         merge(arr, l, m, r);
  69.     }
  70. }
  71.  
  72.  
  73. /* Hàm xuất mảng */
  74. void printArray(int A[], int size)
  75. {
  76.     int i;
  77.     for (i=0; i < size; i++)
  78.         printf("%d ", A[i]);
  79.     printf("\n");
  80. }
  81.  
  82.  
  83. int main()
  84. {
  85.     int arr[] = {12, 11, 13, 5, 6, 7};
  86.     int arr_size = sizeof(arr)/sizeof(arr[0]);
  87.  
  88.     printf("Given array is \n");
  89.     printArray(arr, arr_size);
  90.  
  91.     mergeSort(arr, 0, arr_size - 1);
  92.  
  93.     printf("\nSorted array is \n");
  94.     printArray(arr, arr_size);
  95.     return 0;
  96. }
Advertisement
Add Comment
Please, Sign In to add comment