Advertisement
Guest User

mergesort

a guest
Feb 20th, 2020
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.71 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. void merge(int left, int middle, int right, int* a) {
  5.   int *b, n = right;
  6.   b = (int*)malloc((right - left + 1) * sizeof(int));
  7.   int i = left, j = middle + 1, h = 0;
  8.   while (h < right - left + 1) {
  9.     if ((j <= right) && ((i == middle + 1) || (a[j] < a[i]))) {
  10.       b[h] = a[j];
  11.       j++;
  12.     }
  13.     else {
  14.       b[h] = a[i];
  15.       i++;
  16.     }
  17.     h++;
  18.   }
  19.   for (int i = 0; i < h - 1; i++) {
  20.     a[i] = b[i];
  21.   }
  22.   free(b);
  23. }
  24.  
  25. void insert_sort(int *a, int n) {
  26.             int swap;
  27.             for(int j = 1; j < n; j++) {
  28.                         swap = a[j];
  29.                         int i = j - 1;
  30.                         while((i > -1) && (abs(a[i]) > abs(swap))) {
  31.                                 a[i + 1] = a[i];
  32.                                 i--;
  33.                         }
  34.                         a[i + 1] = swap;
  35.             }
  36. }
  37.  
  38. void merge_sort(int low, int high, int *a) {
  39.     int medium = (low + high) / 2;
  40.     if (high - low + 1 >= 5) {
  41.       merge_sort(low, medium, a);
  42.       merge_sort(medium + 1, high, a);
  43.       merge(low, medium, high, a);
  44.     }
  45.     else {
  46.       insert_sort(a, high + 1);
  47.     }
  48. }
  49.  
  50. void ssort(int left, int right, int* a) {
  51.           if (right - left <= 5) {
  52.             insert_sort(a, right + 1);
  53.           }
  54.           else {
  55.             merge_sort(0, right, a);
  56.           }
  57. }
  58.  
  59. int main()
  60. {
  61.         int n;
  62.         scanf("%d", &n);
  63.         int swap, p;
  64.         int* a = malloc(n * sizeof(int));
  65.         for(int i = 0; i < n; i++) {
  66.                 scanf("%d", &a[i]);
  67.         }
  68.         ssort(0, n - 1, a);
  69.         for (int i = 0; i < n; i++) {
  70.           printf("%d ", a[i]);
  71.         }
  72.         free(a);
  73. }
  74.  
  75. ____________________________________________________________________________________________________________________________
  76.  
  77. Составьте программу mergesort.c, осуществляющую сортировку массива целых чисел в порядке возрастания модуля числа.
  78. В программе должен быть реализован алгоритм сортировки слиянием, рекурсивную функцию которого нужно модифицировать таким образом, чтобы для последовательностей длиной меньше 5 выполнялась сортировка вставками.
  79. Размер и элементы массива должны считываться программой из стандартного потока ввода. Результат сортировки должен быть выведен в стандартный поток вывода.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement