Advertisement
CherMi

Algorithms lab 1 version 1.1

Nov 1st, 2019
260
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 7.90 KB | None | 0 0
  1. #define CRT_SECURE_NO_WARNINGS
  2. #include "pch.h"
  3. #include <iostream>
  4. #include <limits.h>
  5.  
  6. using namespace std;
  7.  
  8. struct Result *s_search(int arr[], int K);
  9. struct Result *q_search(int arr[], int K);
  10. struct Result *t_search(int arr[], int K);
  11. struct Result *bin_search(int arr[], int N, int K);
  12. void sort(int arr[]);
  13. void initialize_result(struct Result *result);
  14.  
  15. struct Result
  16. {
  17.     int count;
  18.     int index[21];
  19.     int oper_count[21];
  20.     int cycle_count[21];
  21. };
  22.  
  23. int main()
  24. {
  25.     int i;
  26.     int N = 21;
  27.     int arr[] = { 23, 74, 52, 11, 23, 9, 67, 48, 12, 23, 64, 73, 6, 29, 97, 34, 76, 23, 15, 49, 5 };
  28.     int K;
  29.     K = 23;
  30.     struct Result result;
  31.  
  32.     result = *s_search(arr, K);
  33.     if (result.count >= 0)
  34.     {
  35.         for (i = 0; i <= result.count; i++)
  36.         {
  37.             printf("Algorithm S: found at position %d, %d operations were required, %d cycle runs.\n", result.index[i], result.oper_count[i], result.cycle_count[i]);
  38.         }
  39.     }
  40.     else
  41.     {
  42.         printf("Algorithm S: not found, %d operations were required, %d cycle runs.\n", result.oper_count[0], result.cycle_count[0]);
  43.     }
  44.  
  45.     result = *q_search(arr, K);
  46.     if (result.count >= 0)
  47.     {
  48.         for (i = 0; i <= result.count; i++)
  49.         {
  50.             printf("Algorithm Q: found at position %d, %d operations were required, %d cycle runs.\n", result.index[i], result.oper_count[i], result.cycle_count[i]);
  51.         }
  52.     }
  53.     else
  54.     {
  55.         printf("Algorithm Q: not found, %d operations were required, %d cycle runs.\n", result.oper_count[0], result.cycle_count[0]);
  56.     }
  57.  
  58.     sort(arr);
  59.     printf("Array was sorted.\n");
  60.    
  61.     result = *t_search(arr, K);
  62.     if (result.count >= 0)
  63.     {
  64.         for (i = 0; i <= result.count; i++)
  65.         {
  66.             printf("Algorithm T: found at position %d, %d operations were required, %d cycle runs.\n", result.index[i], result.oper_count[i], result.cycle_count[i]);
  67.         }
  68.     }
  69.     else
  70.     {
  71.         printf("Algorithm T: not found, %d operations were required, %d cycle runs.\n", result.oper_count[0], result.cycle_count[0]);
  72.     }
  73.  
  74.     result = *bin_search(arr, N, K);
  75.  
  76.     if (result.count >= 0)
  77.     {
  78.         for (i = 0; i <= result.count; i++)
  79.         {
  80.             printf("Algorithm B: found at position %d, %d operations were required, %d cycle runs.\n", result.index[i], result.oper_count[i], result.cycle_count[i]);
  81.         }
  82.     }
  83.     else
  84.     {
  85.         printf("Algorithm B: not found, %d operations were required, %d cycle runs.\n", result.oper_count[0], result.cycle_count[0]);
  86.     }
  87. }
  88.  
  89. struct Result *s_search(int arr[], int K)
  90. {
  91.     struct Result result;
  92.     int i;
  93.     int oper_count = 0, cycle_count = 0;
  94.     initialize_result(&result);
  95.     for (i = 0; i < 21; i++)
  96.     {
  97.         cycle_count++;
  98.         oper_count++; //Проверка условия
  99.         if (arr[i] == K)
  100.         {
  101.             oper_count++; //Запись в result (считаем за одну операцию)
  102.             result.count++;
  103.             result.oper_count[result.count] = oper_count;
  104.             result.index[result.count] = i;
  105.             result.cycle_count[result.count] = cycle_count;
  106.         }
  107.         oper_count++; //Увеличение i
  108.         oper_count++; //Проверка i < 21
  109.  
  110.     }
  111.     if (result.count < 0) //Если не найдено
  112.     {
  113.         result.oper_count[0] = oper_count;
  114.         result.cycle_count[0] = cycle_count;
  115.     }
  116.     return &result;
  117.  
  118. }
  119. struct Result * q_search(int arr[], int K)
  120. {
  121.     int i;
  122.     int oper_count = 0, cycle_count = 0;
  123.     struct Result result;
  124.     initialize_result(&result);
  125.  
  126.     int farr[22]; //Фиктивный массив
  127.     for (i = 0; i < 21; i++) //Добавление фиктивной записи
  128.     {
  129.         farr[i] = arr[i];
  130.     }
  131.     farr[21] = K;
  132.     i = 0;
  133.     while (1)
  134.     {
  135.         cycle_count++;
  136.         oper_count++; //Проверка условия
  137.         if (farr[i] == K)
  138.         {
  139.             oper_count++; //Проверка условия
  140.             if (i <= 20)
  141.             {
  142.                 oper_count++; //Запись в result (считаем за одну операцию)
  143.                 result.count++;
  144.                 result.oper_count[result.count] = oper_count;
  145.                 result.index[result.count] = i;
  146.                 result.cycle_count[result.count] = cycle_count;
  147.             }
  148.             else
  149.             {
  150.                 if (result.count < 0) //Если не найдено
  151.                 {
  152.                     result.oper_count[0] = oper_count;
  153.                     result.cycle_count[0] = cycle_count;
  154.                 }
  155.                 return &result; //Пройдены все элементы массива
  156.             }
  157.         }
  158.         i++;
  159.         oper_count++; //Увеличение i
  160.     }
  161. }
  162.  
  163. struct Result *t_search(int arr[], int K)
  164. {
  165.     struct Result result;
  166.     int oper_count = 0, cycle_count = 0;
  167.     int i;
  168.     initialize_result(&result);
  169.     int farr[22]; //Фиктивный массив
  170.     for (i = 0; i < 21; i++) //Добавление фиктивной записи
  171.     {
  172.         farr[i] = arr[i];
  173.     }
  174.     farr[21] = INT_MIN;
  175.     i = 0;
  176.     while (1)
  177.     {
  178.         cycle_count++;
  179.         oper_count++; //Проверка условия
  180.         if (K >= farr[i])
  181.         {
  182.             oper_count++; //Проверка условия
  183.             if (K == farr[i]) {
  184.                 oper_count++; //Запись в result (считаем за одну операцию)
  185.                 result.count++;
  186.                 result.oper_count[result.count] = oper_count;
  187.                 result.index[result.count] = i;
  188.                 result.cycle_count[result.count] = cycle_count;
  189.             }
  190.             else
  191.             {
  192.                 break;
  193.             }
  194.         }
  195.         i++;
  196.         oper_count++; //Увеличение i
  197.     }
  198.     if (result.count < 0) //Если не найдено
  199.     {
  200.         result.oper_count[0] = oper_count;
  201.         result.cycle_count[0] = cycle_count;
  202.     }
  203.     return &result;
  204. }
  205.  
  206. struct Result *bin_search(int arr[], int N, int K)
  207. {
  208.     int first_upper_index = -1;
  209.     int first_left_index = -1;
  210.     int oper_count = 0, cycle_count = 0;
  211.     int mid, left = 0, right = N - 1;
  212.     struct Result result;
  213.     initialize_result(&result);
  214.  
  215.     //Поиск самого левого подходящего элемента
  216.     while (left <= right)
  217.     {
  218.         cycle_count++;
  219.         oper_count++; //Проверка условия цикла
  220.         mid = (left + right) / 2;
  221.         oper_count++; //Операция присваивания
  222.         oper_count += 2; //Проверка условия и операция присваивания (ниже)
  223.         if (K >= arr[mid])
  224.         {
  225.             right = mid - 1;
  226.         }
  227.         else //K < arr[mid]
  228.         {
  229.             left = mid + 1;
  230.         }
  231.     }
  232.     first_left_index = mid;
  233.  
  234.     oper_count++; //Запись в result (считаем за одну операцию)
  235.     result.count = 0;
  236.     result.oper_count[0] = oper_count;
  237.     result.index[0] = first_left_index;
  238.     result.cycle_count[0] = cycle_count;
  239.     if (first_left_index < 0) //Если не найдено
  240.     {
  241.         result.count = -1;
  242.         return &result;
  243.     }
  244.  
  245.     //Поиск первого неподходящего элемента справа
  246.     left = 0;
  247.     right = N - 1;
  248.    
  249.     while (left <= right)
  250.     {
  251.         cycle_count++;
  252.         oper_count++; //Проверка условия цикла
  253.         mid = (left + right) / 2;
  254.         oper_count++; //Операция присваивания
  255.         if (K <= arr[mid])
  256.         {
  257.             left = mid + 1;
  258.             oper_count += 2; //Проверка условия и операция присваивания
  259.         }
  260.         else //K > arr[mid]
  261.         {
  262.             right = mid;
  263.             oper_count += 2; //Проверка условия и операция присваивания
  264.             oper_count++; //Проверка условия
  265.             if (right == left) //Предотвращает бесконечный цикл; TODO: постараться убрать
  266.             {
  267.                 break;
  268.             }
  269.         }
  270.     }
  271.     first_upper_index = mid;
  272.  
  273.     result.count = (first_upper_index - first_left_index - 1);
  274.     for (int i = 1; i <= result.count; i++)
  275.     {
  276.         result.index[i] = first_left_index + i;
  277.         result.cycle_count[i] = cycle_count;
  278.         result.oper_count[i] = oper_count + i; //Запись в result (считаем за одну операцию)
  279.     }
  280.     return &result;
  281. }
  282.  
  283. void sort(int arr[]) //Сортировка по убыванию пузырьком
  284. {
  285.     int i, j, temp;
  286.     for (i = 0; i < 21; i++)
  287.     {
  288.         for (j = i; j < 21; j++)
  289.         {
  290.             if (arr[i] < arr[j])
  291.             {
  292.                 temp = arr[i];
  293.                 arr[i] = arr[j];
  294.                 arr[j] = temp;
  295.             }
  296.         }
  297.     }
  298. }
  299.  
  300. void initialize_result(struct Result *result)
  301. {
  302.     int i;
  303.     result->count = -1;
  304.     for (i = 0; i < 21; i++)
  305.     {
  306.         result->index[i] = 0;
  307.         result->oper_count[i] = 0;
  308.         result->cycle_count[i] = 0;
  309.     }
  310. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement