Advertisement
_takumi

КОД ДОЛБАЕБА СВЕТЛОГО(

Feb 10th, 2022 (edited)
628
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.27 KB | None | 0 0
  1. #include <stdlib.h>
  2. #include <stdbool.h>
  3. #include <string.h>
  4. #include <stdio.h>
  5. #include <time.h>
  6.  
  7. /*
  8.  * Условия задачи
  9.  * Тип элемента: int.
  10.  * Тип сортировки: по неубыванию.
  11.  * Методы сортировки: сортировка простым выбором + сортировка Шелла.
  12.  */
  13.  
  14. int cmps = 0, prms = 0;
  15. static bool cmp(int lhs, int rhs) {
  16.     cmps++;
  17.     if (lhs > rhs) return 0;
  18.     return 1;
  19. }
  20.  
  21. static void swap(int *lhs, int *rhs) {
  22.     int temp = *lhs;
  23.     *lhs = *rhs;
  24.     *rhs = temp;
  25.     prms++;
  26. }
  27.  
  28. static void gen(int n, int *a, int type) {
  29.     if (type == 1) {
  30.         for (int i = 0; i < n; ++i) {
  31.             a[i] = i + 1;
  32.         }
  33.     } else if (type == 2) {
  34.         for (int i = 0; i < n; ++i) {
  35.             a[i] = n - i;
  36.         }
  37.     } else if (type == 3 || type == 4) {
  38.         for (int i = 0; i < n; ++i) {
  39.             a[i] = rand();
  40.         }
  41.     }
  42. }
  43.  
  44. static void selection_sort(int n, int *a) {
  45.     int min_index;
  46.     for (int i = 0; i < n - 1; ++i) {
  47.         min_index = i;
  48.         for (int j = i + 1; j < n; ++j) {
  49.             if (cmp(a[j], a[min_index])) {
  50.                 min_index = j;
  51.             }
  52.         }
  53.         swap(a + min_index, a + i);
  54.     }
  55. }
  56.  
  57. static void shell_sort(int n, int *a) {
  58.     for (int d = n / 2; d > 0; d /= 2) {
  59.         for (int i = d; i < n; ++i) {
  60.             for (int j = i - d; j >= 0 && !cmp(a[j], a[j + d]); j -= d) {
  61.                 swap(a + j, a + j + d);
  62.             }
  63.         }
  64.     }
  65. }
  66.  
  67. static void test(int *a, int *sorted, int n) {
  68.     int *checked = (int *) calloc(n, sizeof(int));
  69.     // found показывает, найден ли текущий элемент отсортированного массива в исходном
  70.     int found = 0;
  71.     for (int i = 0; i < n; ++i) {
  72.         for (int j = 0; j < n; ++j) {
  73.             // Если в исходном массиве есть такая позиция,
  74.             // что ее значение равно значению текущего элемента отсортированного массива
  75.             // и она еще не была использована для проверки,
  76.             // то помечаем ее как использованную и задаем found = 1
  77.             if (sorted[i] == a[j]) {
  78.                 if (checked[j] == 0) {
  79.                     checked[j] = 1;
  80.                     found = 1;
  81.                     break;
  82.                 }
  83.             }
  84.         }
  85.         // Если элемент отсортированного массива не найден в исходном,
  86.         // печатам сообщение об ошибке
  87.         if (found == 0) {
  88.             printf("Элементы отсортированного массива не совпадают с элементами изначального массива\n");
  89.             free(checked);
  90.             return;
  91.         } else
  92.             found = 0;
  93.     }
  94.     // Проверяем, правильно ли отсортированы элементы
  95.     for (int i = 1; i < n; ++i) {
  96.         if (sorted[i] < sorted[i - 1]) {
  97.             printf("Элементы отсортированы в неправильном порядке\n");
  98.             break;
  99.         }
  100.     }
  101.     free(checked);
  102. }
  103.  
  104. static void print(int *arr, int n) {
  105.     for (int i = 0; i < n; ++i) {
  106.         printf("%d ", arr[i]);
  107.     }
  108.     printf("\n");
  109. }
  110.  
  111. int main(void) {
  112.     int n = 0;
  113.     if (scanf("%d", &n) != 1) {
  114.         printf("Input error");
  115.         return 400;
  116.     };
  117.     srand(time(0));
  118.     for (int i = 1; i <= 4; ++i) {
  119.         if (i == 1) {
  120.             printf("-----------ЭЛЕМЕНТЫ УЖЕ УПОРЯДОЧЕНЫ-----------\n");
  121.         } else if (i == 2) {
  122.             printf("-----------ЭЛЕМЕНТЫ УПОРЯДОЧЕНЫ В ОБРАТНОМ ПОРЯДКЕ-----------\n");
  123.         } else if (i == 3 || i == 4) {
  124.             printf("-----------РАССТАНОВКА ЭЛЕМЕНТОВ СЛУЧАЙНА-----------\n");
  125.         }
  126.  
  127.         int *a = (int *) malloc(sizeof(int) * n);
  128.         gen(n, a, i);
  129.         printf("Исходный массив:\n");
  130.         print(a, n);
  131.  
  132.         int *copy1 = (int *) malloc(sizeof(int) * n);
  133.         int *copy2 = (int *) malloc(sizeof(int) * n);
  134.         memcpy(copy1, a, n * sizeof(int));
  135.         memcpy(copy2, a, n * sizeof(int));
  136.  
  137.         selection_sort(n, copy1);
  138.         printf("Массив после сортировки выбором:\n");
  139.         print(copy1, n);
  140.         printf("Перестановок и сравнений в сортировке методом простого выбора соответственно: %d, %d\n", prms, cmps);
  141.         cmps = 0;
  142.         prms = 0;
  143.         test(a, copy1, n);
  144.  
  145.         shell_sort(n, copy2);
  146.         printf("Массив после сортировки Шелла:\n");
  147.         print(copy2, n);
  148.         printf("Перестановок и сравнений в сортировке методом Шелла: %d, %d\n", prms, cmps);
  149.         cmps = 0;
  150.         prms = 0;
  151.         test(a, copy2, n);
  152.  
  153.         free(a);
  154.         free(copy1);
  155.         free(copy2);
  156.         printf("\n");
  157.     }
  158.     return 0;
  159. }
  160.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement