fork download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <locale.h>
  4.  
  5. // Функция для слияния двух половин массива
  6. void merge(int arr[], int left, int mid, int right) {
  7. int i, j, k;
  8. int n1 = mid - left + 1;
  9. int n2 = right - mid;
  10.  
  11. // Динамическое выделение памяти для временных массивов
  12. int* L = (int*)malloc(n1 * sizeof(int));
  13. int* R = (int*)malloc(n2 * sizeof(int));
  14.  
  15. // Копируем данные во временные массивы
  16. for (i = 0; i < n1; i++)
  17. L[i] = arr[left + i];
  18. for (j = 0; j < n2; j++)
  19. R[j] = arr[mid + 1 + j];
  20.  
  21. // Слияние временных массивов обратно в arr[left..right]
  22. i = 0; // Индекс первого подмассива
  23. j = 0; // Индекс второго подмассива
  24. k = left; // Индекс объединенного подмассива
  25. while (i < n1 && j < n2) {
  26. if (L[i] <= R[j]) {
  27. arr[k] = L[i];
  28. i++;
  29. }
  30. else {
  31. arr[k] = R[j];
  32. j++;
  33. }
  34. k++;
  35. }
  36.  
  37. // Копируем оставшиеся элементы L[], если они есть
  38. while (i < n1) {
  39. arr[k] = L[i];
  40. i++;
  41. k++;
  42. }
  43.  
  44. // Копируем оставшиеся элементы R[], если они есть
  45. while (j < n2) {
  46. arr[k] = R[j];
  47. j++;
  48. k++;
  49. }
  50.  
  51. // Освобождаем выделенную память
  52. free(L);
  53. free(R);
  54. }
  55.  
  56. // Рекурсивная функция сортировки слиянием
  57. void mergeSort(int arr[], int left, int right) {
  58. if (left < right) {
  59. int mid = left + (right - left) / 2;
  60.  
  61. // Сортируем первую и вторую половины
  62. mergeSort(arr, left, mid);
  63. mergeSort(arr, mid + 1, right);
  64.  
  65. // Слияние отсортированных половин
  66. merge(arr, left, mid, right);
  67. }
  68. }
  69.  
  70. // Вспомогательная функция для вывода массива
  71. void printArray(int arr[], int size) {
  72. for (int i = 0; i < size; i++)
  73. printf("%d ", arr[i]);
  74. printf("\n");
  75. }
  76.  
  77. // Основная функция
  78. int main() {
  79. setlocale(LC_ALL, "Russian");
  80. int arr[] = { 12, 11, 13, 5, 6, 7 };
  81. int arr_size = sizeof(arr) / sizeof(arr[0]);
  82.  
  83. printf("Исходный массив:\n");
  84. printArray(arr, arr_size);
  85.  
  86. mergeSort(arr, 0, arr_size - 1);
  87.  
  88. printf("Отсортированный массив:\n");
  89. printArray(arr, arr_size);
  90.  
  91. return 0;
  92. }
Success #stdin #stdout 0.01s 5280KB
stdin
Standard input is empty
stdout
Исходный массив:
12 11 13 5 6 7 
Отсортированный массив:
5 6 7 11 12 13