Qellex

lab 9 - 18v

May 19th, 2022 (edited)
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.25 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #include <string.h>
  5. // формирует массив по возрастанию
  6. int* arr_up(int n) {
  7.     int* result = (int*)malloc(sizeof(int) * n);
  8.     for (int i = 0; i < n; i++)
  9.         result[i] = i + 1;
  10.  
  11.     return result;
  12. }
  13. // формирует массив по уменьшению
  14. int* arr_down(int n) {
  15.     int* result = (int*)malloc(sizeof(int) * n);
  16.     for (int i = n - 1; i >= 0; i--)
  17.         result[n - 1 - i] = i + 1;
  18.     return result;
  19. }
  20. // формирует массив из рандомных элементов
  21. int* arr_rand(int n) {
  22.     int* result = (int*)malloc(sizeof(int) * n);
  23.     for (int i = 0; i < n; i++)
  24.         result[i] = rand() % 100;
  25.     return result;
  26. }
  27.  
  28. // алгоритм быстрой сортировки
  29. unsigned long long qsortRecursive(int* mas, int size) {
  30.     unsigned long long counter = 0;
  31.     int i = 0; // начало массива
  32.     int j = size - 1; // конец
  33.     int mid = mas[size / 2]; // середина
  34.     // смотрим лево право, разбиваем его на ещё меньшие пропорции и меняем местами
  35.     do {
  36.         while (mas[i] < mid) {
  37.             i++;
  38.             counter++;
  39.         }
  40.         while (mas[j] > mid) {
  41.             j--;
  42.             counter++;
  43.         }
  44.         if (i <= j) {
  45.             int tmp = mas[i];
  46.             mas[i] = mas[j];
  47.             mas[j] = tmp;
  48.             counter++;
  49.             i++;
  50.             j--;
  51.         }
  52.     } while (i <= j);
  53.     if (j > 0) {
  54.         counter += qsortRecursive(mas, j + 1);
  55.     }
  56.     if (i < size) {
  57.         counter += qsortRecursive(&mas[i], size - i);
  58.     }
  59.     return counter;
  60. }
  61.  
  62. // алгоритм бинарных вставок
  63. unsigned long long BinSort(int* mas, int n) {
  64.     int key, low, hight, mid;
  65.     unsigned long long count = 0;
  66.     for (int i = 1; i < n; i++) {
  67.         key = mas[i];
  68.         low = 0; hight = i - 1;
  69.         while (low < hight) {
  70.             mid = low + (hight - low) / 2;
  71.             if (key < mas[mid])
  72.                 hight = mid;
  73.             else
  74.                 low = mid + 1;
  75.             count++;
  76.         }
  77.         for (int j = i; j < low + 1; j--) {
  78.             mas[j] = mas[j - 1];
  79.             count++;
  80.         }
  81.         mas[low] = key;
  82.         count++;
  83.     }
  84.     return count;
  85. }
  86. void main() {
  87.     srand(time(NULL));
  88.     FILE* f;
  89.     fopen_s(&f, "result.txt", "w+");
  90.     for (int n = 500; n <= 50000; n += 500) {
  91.         int* arr = (int*)malloc(sizeof(int) * n);
  92.          int* arr1 = (int*)malloc(sizeof(int) * n);
  93.         unsigned long long result[6];
  94.         arr = arr_up(n);
  95.         result[0] = BinSort(arr, n); // по возраст, бин сортировка
  96.         result[3] = qsortRecursive(arr, n); // по возраст, быстрая сорт
  97.         arr = arr_down(n);
  98.         result[2] = BinSort(arr, n); // по уменьше, бин сорт
  99.         arr = arr_down(n);
  100.         result[5] = qsortRecursive(arr, n); // по уменьше, быстрая сорт
  101.         unsigned long long summ = 0, summm = 0; // для бинарной и быстрой
  102.         for (int i = 0; i < 100; i++) {
  103.             arr = arr_rand(n);
  104.             memcpy(arr1, arr, sizeof(arr));
  105.             summ += BinSort(arr, n);
  106.             summm += qsortRecursive(arr1, n);
  107.         }
  108.         result[1] = summ / 100; // ранд, бин сорт
  109.         result[4] = summm / 100; // ранд, быстрая сорт
  110.         printf("%d\n", n);
  111.         fprintf(f, "%d %llu %llu %llu %llu %llu %llu\n", n, result[0], result[1], result[2],
  112.             result[3], result[4], result[5]);
  113.     }
  114.     fclose(f);
  115.     return;
  116. }
Add Comment
Please, Sign In to add comment