AmateurKid

Untitled

Dec 20th, 2021
875
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.53 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <chrono>
  4. #include <algorithm>
  5.  
  6. using namespace std;
  7.  
  8.  
  9.  
  10. void print_vec(vector<int> vec, int arr_size) {
  11.     int max_arr;
  12.     if (arr_size > 30) { //если количество символов больше 30, то сортируются все, но выводятся лишь первые 30 отсортированных
  13.         max_arr = 30;
  14.     }
  15.     else {
  16.         max_arr = arr_size;
  17.     }
  18.  
  19.     for (int i = 0; i < max_arr; i++)
  20.         cout << vec[i] << ' ';
  21. }
  22.  
  23.  
  24. void qsort(int b, int e, vector<int>& vec)
  25. {
  26.    
  27.     int l = b, r = e;
  28.     int piv = vec[(l + r) / 2];
  29.     while (l <= r)
  30.     {
  31.         while (vec[l] < piv)
  32.             l++;
  33.         while (vec[r] > piv)
  34.             r--;
  35.         if (l <= r)
  36.             swap(vec[l++], vec[r--]);
  37.     }
  38.     if (b < r)
  39.         qsort(b, r, vec);
  40.     if (e > l)
  41.         qsort(l, e, vec);
  42.    
  43. }
  44.  
  45.  
  46. int main()
  47. {
  48.     char answ;
  49.     do {
  50.         int arr_size;
  51.         char answ_input;
  52.         cout << "Enter array size>>";
  53.         cin >> arr_size;
  54.         int a;
  55.  
  56.         while (cin.fail() || arr_size <= 1 || cin.peek() != '\n')
  57.         {
  58.             cout << "Error, invalid parameters \n";
  59.             cin.clear();
  60.             cin.ignore(10000, '\n');
  61.             cout << "Enter array size>>";
  62.             cin >> arr_size;
  63.         }
  64.  
  65.  
  66.  
  67.         vector <int> vec1;
  68.         vector <int> vec2;
  69.         vec1.reserve(arr_size);
  70.         vec1.reserve(arr_size);
  71.  
  72.  
  73.         cout << "How to fill vector?(1 - from keyboard, 2 - random numbers, 3 - random numbers sorted backwards>>";
  74.         cin >> answ_input;
  75.         while (cin.fail() || cin.peek() != '\n' || (answ_input != '1' && answ_input != '2' && answ_input != '3'))
  76.         {
  77.             cin.clear();
  78.             cin.ignore(10000, '\n');
  79.             cout << "Error, invalid parameters \n";
  80.             cout << "How to fill vector?(1 - from keyboard, 2 - random numbers, 3 - random numbers sorted backwards>>";
  81.             cin >> answ_input;
  82.         }
  83.  
  84.         if (answ_input == '1') {
  85.             for (int i = 0; i < arr_size; i++) { //заполняем вектор
  86.                 cout << "Enter " << i + 1 << " element>>";
  87.                 cin >> a;
  88.                 while (cin.fail() || cin.peek() != '\n')
  89.                 {
  90.                     cin.clear();
  91.                     cin.ignore(10000, '\n');
  92.                     cout << "Error, invalid parameter \n";
  93.                     cin >> a;
  94.                 }
  95.                 vec1.push_back(a);
  96.                 vec2.push_back(a);
  97.             }
  98.             auto start1 = chrono::high_resolution_clock::now(); //конец отсчёта времени
  99.             sort(vec1.begin(), vec1.end());
  100.             auto end1 = chrono::high_resolution_clock::now(); //точка отсчёт времени начала сортировки функции
  101.             chrono::duration <double> duration1 = end1 - start1; //считаем время работы сортировки функцией
  102.             cout << "Library sorted this vector in " << duration1.count() << endl; // считаем время
  103.  
  104.  
  105.             auto start2 = chrono::high_resolution_clock::now(); //точка отсчёт времени начала сортировки функции
  106.             qsort(0, (arr_size - 1), vec2);
  107.             auto end2 = chrono::high_resolution_clock::now(); //конец отсчёта времени
  108.             chrono::duration <double> duration2 = end2 - start2; //считаем время работы сортировки функцией
  109.             cout << "Algorithm sorted this vector in " << duration2.count() << endl; // считаем время
  110.  
  111.             print_vec(vec1, arr_size);
  112.             cout << endl;
  113.             print_vec(vec2, arr_size);
  114.  
  115.             if (duration1.count() - duration2.count() > 0)
  116.             {
  117.                 cout << "The function was faster by " << (duration1.count() / duration2.count()) * 1000 << " ms \n";
  118.             }
  119.             else
  120.             {
  121.                 cout << "The algorithm was faster by " << abs((duration1.count() / duration2.count())) * 1000 << " ms \n";
  122.             }
  123.  
  124.         }
  125.         else if (answ_input == '2') {
  126.             for (int i = 0; i < arr_size; i++) { //заполняем вектор
  127.                 a = rand() % 100;
  128.                 vec1.push_back(a);
  129.                 vec2.push_back(a);
  130.             }
  131.             auto start1 = chrono::high_resolution_clock::now();
  132.             sort(vec1.begin(), vec1.end());
  133.             auto end1 = chrono::high_resolution_clock::now();
  134.             chrono::duration <double> duration1 = end1 - start1;
  135.             cout << "Library sorted this vector in " << duration1.count() << endl;
  136.            
  137.  
  138.             auto start2 = chrono::high_resolution_clock::now(); //точка отсчёт времени начала сортировки функции
  139.             qsort(0, (arr_size - 1), vec2);
  140.             auto end2 = chrono::high_resolution_clock::now(); //конец отсчёта времени
  141.             chrono::duration <double> duration2 = end2 - start2; //считаем время работы сортировки функцией
  142.             cout << "Algorithm sorted this vector in " << duration2.count() << endl; // считаем время
  143.  
  144.             print_vec(vec1, arr_size);
  145.             cout << endl;
  146.             print_vec(vec2, arr_size);
  147.  
  148.             if (duration1.count() - duration2.count() > 0)
  149.             {
  150.                 cout << "The function was faster by " << (duration1.count() / duration2.count()) * 1000 << " ms \n";
  151.             }
  152.             else
  153.             {
  154.                 cout << "The algorithm was faster by " << abs((duration1.count() / duration2.count())) * 1000 << " ms \n";
  155.             }
  156.         }
  157.         else if (answ_input == '3') {
  158.             for (int i = 0; i < arr_size; i++) {
  159.                 a = rand() % 100;
  160.                 vec1.push_back(a);
  161.                 vec2.push_back(a);
  162.             }
  163.  
  164.             auto start1 = chrono::high_resolution_clock::now();
  165.             sort(vec1.begin(), vec1.end(), greater<int>());
  166.            
  167.             auto end1 = chrono::high_resolution_clock::now();
  168.             chrono::duration <double> duration1 = end1 - start1;
  169.             cout << "Library sorted this vector in " << duration1.count() << endl;
  170.  
  171.             auto start2 = chrono::high_resolution_clock::now();
  172.             qsort(0, (arr_size - 1), vec2);
  173.             reverse(vec2.begin(), vec2.end());
  174.             auto end2 = chrono::high_resolution_clock::now();
  175.             chrono::duration <double> duration2 = end2 - start2;
  176.             cout << "Algorithm sorted this vector in " << duration2.count() << endl;
  177.  
  178.             cout << "Vector sorted by library: "<< endl;
  179.             print_vec(vec1, arr_size);
  180.             cout << endl;
  181.             cout << "Vector sorted by library" << endl;
  182.             print_vec(vec2, arr_size);
  183.  
  184.             if (duration1.count() - duration2.count() > 0)
  185.             {
  186.                 cout << "The function was faster by " << (duration1.count() / duration2.count()) * 1000 << " ms \n";
  187.             }
  188.             else
  189.             {
  190.                 cout << "The algorithm was faster by " << abs((duration1.count() / duration2.count())) * 1000 << " ms \n";
  191.             }
  192.         }
  193.  
  194.        
  195.  
  196.         vec1.clear();
  197.         vec2.clear();
  198.  
  199.         cout << "\n Do you want to repeat (y/n)>> ";
  200.         cin >> answ;
  201.         while (cin.fail() || cin.peek() != '\n' || (answ != 'n' && answ != 'N' && answ != 'Y' && answ != 'y'))
  202.         {
  203.             cin.clear();
  204.             cin.ignore(10000, '\n');
  205.             cout << "Error, invalid parameters \n";
  206.             cout << "\n Do you want to repeat (y/n)>> ";
  207.             cin >> answ;
  208.         }
  209.     } while ((answ == 'y') || (answ == 'Y'));
  210.     return 0;
  211. }
  212.  
  213.  
Advertisement
Add Comment
Please, Sign In to add comment