Advertisement
Guest User

Untitled

a guest
May 22nd, 2019
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.65 KB | None | 0 0
  1. #include "pch.h"
  2. #include <iostream>
  3.  
  4. using namespace std;
  5. //Стандартний компаратор
  6. template <typename T>
  7. class standart_cmp
  8. {
  9. public:
  10.   static bool less(const T &a, const T &b)
  11.   {
  12.     return a < b;
  13.   }
  14. };
  15.  
  16. //Функцiя злиття масиву
  17. //array - масив, який впорядкований (за допомогою цього ж компаратора) до middle, i пiсля middle
  18. //buffer - масив, розмiром не менше нiж array
  19. template <typename T, typename cmp = standart_cmp<T> >
  20.  
  21. void merge(T *array, T *buffer, int left, int middle, int right)
  22. {
  23.   //iндеси зчитування чисел з array
  24.   int it_left = 0;
  25.   int it_right = 0;
  26.  
  27.   //Як тiльки будь - якої з "iтераторiв" виходить за кордон, припиняємо цикл
  28.   while (left + it_left < middle && middle + it_right < right)
  29.   {
  30.     if (cmp::less(array[left + it_left], array[middle + it_right]))
  31.     {
  32.       buffer[it_left + it_right] = array[left + it_left];
  33.       it_left++;
  34.     }
  35.     else
  36.     {
  37.       buffer[it_left + it_right] = array[middle + it_right];
  38.       it_right++;
  39.     }
  40.   }
  41.  
  42.   //Записуємо частини, що залишилися, невиписанi з array
  43.   while (left + it_left < middle)
  44.   {
  45.     buffer[it_left + it_right] = array[left + it_left];
  46.     it_left++;
  47.   }
  48.  
  49.   while (middle + it_right < right)
  50.   {
  51.     buffer[it_left + it_right] = array[middle + it_right];
  52.     it_right++;
  53.   }
  54.  
  55.   //Виписуємо buffer в array
  56.   for (int i = 0; i < it_left + it_right; i++)
  57.     array[left + i] = buffer[i];
  58. }
  59.  
  60.  
  61. // array - масив
  62. // buffer - буфер для сортування, розмiром не менше, нiж array
  63. // left - нижня межа, right - верхня
  64. template <typename T, typename cmp = standart_cmp<T> >
  65. void merge_sort(T *array, T *buffer, int left, int right)
  66. {
  67.   // Масив одиничного розмiру вже отсортiрованностi вважається
  68.   if (right - left <= 1)
  69.   {
  70.     return;
  71.   }
  72.  
  73.   // iндекс серединного елемента
  74.   int middle = left + (right - left) / 2;
  75.  
  76.  
  77.  
  78.  // Сортуємо половинки масиву
  79.   merge_sort(array, buffer, left, middle);
  80.   merge_sort(array, buffer, middle, right);
  81.  
  82. // Складаємо з двох вiдсортованих половинок
  83.  
  84.  // Цiлий вiдсортований масив
  85.   merge<T, cmp>(array, buffer, left, middle, right);
  86. }
  87. int binarySearch(int arr[], int l, int r, int x)
  88. {
  89.   while (l <= r) {
  90.  
  91.     int m = l + (r - l) / 2;
  92.  
  93.     // Перевірка x,y
  94.     if (arr[m] == x)
  95.       return m;
  96.  
  97.     // як що x совпада то ухилення
  98.     if (arr[m] < x)
  99.       l = m + 1;
  100.  
  101.     // як що х малий то ухилення правого руху
  102.     else
  103.       r = m - 1;
  104.   }
  105.  
  106.   // описання елементу
  107.   // не присутній
  108. //
  109.   return -1;
  110. }
  111.  
  112.  
  113.  
  114. int main()
  115. {
  116.   setlocale(LC_CTYPE, "ukr");
  117.   int n;
  118.   cout << "Введiть скiльки елементiв вам потрiбно [1-256]" << endl;
  119.   cin >> n;
  120.   while (n < 1 || n>256) { //цикл для перевірки
  121.     cout << "Повинно бути[1-256]\n";
  122.     cin >> n;
  123.   }
  124.  
  125.  
  126.  
  127.   int *arr = new int[n];
  128.   int *buff = new int[n];
  129.  
  130.  
  131.  
  132.   for (int i = 0; i < n; i++)
  133.   {
  134.     cout << "Введiть елемент  " << endl;
  135.     cin >> arr[i];
  136.   }
  137.  
  138.   merge_sort(arr, buff, 0, n);
  139.  
  140.   cout << " Вiдсортованi числа способом злиття" << endl;
  141.   for (int i = 0; i < n; i++)
  142.   {
  143.     cout << arr[i] << " ";
  144.   }
  145.  
  146.   cout << endl;
  147.  
  148.   int n2; //друга частина програми пошуку
  149.   cout << "Уведiть кiлькiсть елементiв для пошуку" << endl;
  150.  
  151.  
  152.   cin >> n2; //введення розміру пошуку
  153.  
  154.  
  155.   int *arrs = new int[n2]; //запис в масив
  156.   for (int i = 0; i < n2; i++) //цикл для введення елементів
  157.  
  158.  
  159.  
  160.  {
  161.     cout << "Введiть елемент  " << endl;
  162.     cin >> arrs[i];
  163.   }
  164.  
  165.  
  166.  
  167.   for (int i = 0; i < n2; i++)
  168.   {
  169.    
  170.  int result = binarySearch(arr, 0, n - 1, arrs[i]);  //підрахунок та запис знайденних індексів
  171.  
  172.     if (result == -1) cout << "Елемент " << arrs[i] << " вiдсутнiй у вiдсортованному массивi" << endl;
  173.    
  174.  else cout << "Елемент " << arrs[i] << " знаходиться у вiдсортованному массивi за iндексом " << result << endl;
  175.  
  176.   }
  177.   cout << endl;
  178.  
  179.   return 0;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement