Advertisement
Leeen

dop lab for Bezus № 2

Nov 5th, 2018
349
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.56 KB | None | 0 0
  1. // Лабораторная для Безуса №3 вариант 12
  2.  
  3. #include<iostream>
  4. #include<vector>
  5. #include<string>
  6. #include<ctime>
  7. #include<algorithm>
  8.  
  9. using namespace std;
  10.  
  11. // Рандомно получаем и заполняем вектор
  12. vector<int> getRandomVec(int sizeOfVector, int x)
  13. {
  14.     vector<int> vec;
  15.  
  16.     //Наполняем вектор абсолютно рандомно
  17.     if (x == 0)
  18.         for (int i = 0; i < sizeOfVector; i++)
  19.         {
  20.             vec.push_back(rand());
  21.         }
  22.  
  23.     //Наполняем вектор с уникальными значениями от 1 до x
  24.     else for (int i = 0; i < sizeOfVector; i++)
  25.     {
  26.         vec.push_back(rand() % x);
  27.     }
  28.     return vec;
  29. }
  30.  
  31. // Делаем копию вектора
  32. vector<int> getRandomVecCustomSort(vector<int> getRandomVec)
  33. {
  34.     vector<int> vecCustomSort;
  35.     int sizeOfVector = getRandomVec.size();
  36.    
  37.         for (int i = 0; i < sizeOfVector; i++)
  38.         {
  39.             getRandomVec.push_back(rand());
  40.             vecCustomSort.push_back(getRandomVec[i]);
  41.         }
  42.         return vecCustomSort;
  43. }
  44.  
  45. // Печатает вектор длиной 10 первых символов, даже если вектор больше
  46. void printVector(vector<int> vec)
  47. {
  48.     // Если длина вектора не более 10
  49.     if (vec.size() <= 10)
  50.         for (int i = 0; i < vec.size(); i++)
  51.         {
  52.             cout << vec[i] << ' ';
  53.         }
  54.     // Если длина вектора больше 10
  55.     else for (int i = 0; i < 10; i++)
  56.     {
  57.         cout << vec[i] << ' ';
  58.     }
  59.  
  60.     cout << endl;
  61. }
  62.  
  63. // Ввод чисел в вектор
  64. vector<int> inputVector(int sizeOfVector, int x)
  65. {
  66.     vector<int> vec;
  67.     int number;
  68.     for (int i = 0; i < sizeOfVector; i++) {
  69.         cout << "Input " << i + 1 << " element of array: ";
  70.         cin >> number;
  71.         vec.push_back(number);
  72.     }
  73.     return vec;
  74. }
  75.  
  76. // Проверка на ввод согласия
  77. int checkYesNo(string yn) {
  78.     if (yn == "Yes" || yn == "YES" || yn == "yes" || yn == "y" ) return 1;
  79.     else if (yn == "No" || yn == "NO" || yn == "no" || yn == "n") return 2;
  80.     else return 0;
  81. }
  82.  
  83. //Согласно выбранному пути, заполняем вектор рандомными значениями или вводимыми пользователем
  84. vector<int> setChoice(string yn, int x, int sizeOfVector)
  85. {
  86.     vector<int> vec;
  87.  
  88.     //Если мы согласны получить рандомный вектор
  89.     if (checkYesNo(yn) == 1)
  90.     {
  91.         vec = getRandomVec(sizeOfVector, x);
  92.         printVector(vec);
  93.         cout << endl;
  94.     }
  95.  
  96.     //Если мы хотим заполнить ветор сами
  97.     else if (checkYesNo(yn) == 2)
  98.     {
  99.         vec = inputVector(sizeOfVector, x);
  100.         printVector(vec);
  101.         cout << endl;
  102.     }
  103.     return vec;
  104. }
  105.  
  106. // Сортировка Шелла
  107. vector<int> ShellSort(vector<int> vec)
  108. {
  109.     int i, j, step;
  110.     int tmp;
  111.     for (step = vec.size() / 2; step > 0; step /= 2)
  112.         for (i = step; i < vec.size(); i++)
  113.         {
  114.             tmp = vec[i];
  115.             for (j = i; j >= step; j -= step)
  116.             {
  117.                 if (tmp < vec[j - step])
  118.                     vec[j] = vec[j - step];
  119.                 else
  120.                     break;
  121.             }
  122.             vec[j] = tmp;
  123.         }
  124.  
  125.     return vec;
  126. }
  127.  
  128. vector<int> firstStep(vector <int> vec)
  129. {
  130.     vector<int> first = vec;
  131.     int i, j, step;
  132.     int tmp, m;
  133.     for (step = vec.size() / 2; step > 0; step /= 2)
  134.         for (i = step; i < vec.size(); i++)
  135.         {
  136.             tmp = vec[i];
  137.             for (j = i; j >= step; j -= step)
  138.             {
  139.                  
  140.                 if (tmp < vec[j - step] && step == first.size() / 2) {
  141.                     vec[i] = vec[j - step];
  142.                     vec[j - step] = tmp;
  143.                     return vec;
  144.                 }
  145.                 else
  146.                     break;
  147.             }
  148.            
  149.         }
  150.  
  151.  
  152. }
  153.  
  154. int main()
  155. {
  156.  
  157.     vector<int> vec;
  158.     vector<int> vecCustomSort;
  159.  
  160.     cout << "Hi, lets sort vector" << endl;
  161.  
  162.     string yn;
  163.  
  164.     cout << "Do you want get random vector? [Yes/No]" << endl;
  165.  
  166.     // Пока мы вводим неправильно Yes/No, программа выкидывает ошибку и просит повторить
  167.     do
  168.     {
  169.         getline(cin, yn);
  170.         if (checkYesNo(yn) == 0)
  171.             cout << "Error! Try again" << endl << "Do you want get random vector? [Yes/No]" << endl << endl;
  172.     } while (checkYesNo(yn) == 0);
  173.  
  174.     cout << "Enter the number of variables in the vector: ";
  175.     int sizeOfVector;
  176.     cin >> sizeOfVector;
  177.  
  178.     int x = 0;
  179.  
  180.     // Если мы хотим создать рандомный массив, то введем число уникальных чисел
  181.     if (checkYesNo(yn) == 1)
  182.     {
  183.         cout << "Enter the number of unique integers (Enter [0] if you do not need it)" << endl;
  184.         cin >> x;
  185.     }
  186.     vec = setChoice(yn, x, sizeOfVector);
  187.  
  188.     vector<int> fStep = firstStep(vec);
  189.    
  190.     printVector(fStep);
  191.     cout << endl;
  192.  
  193.     double timeOfShellSort = clock();
  194.     vecCustomSort = ShellSort(vec);
  195.     timeOfShellSort = (clock() - timeOfShellSort) / CLOCKS_PER_SEC;
  196.  
  197.     cout << "Sorted by Shell's function:" << endl;
  198.     printVector(vecCustomSort);
  199.     cout << "Vector is sorted by Shell's function in " << timeOfShellSort << " sec" << endl << endl;
  200.  
  201.     // Получим текущее время
  202.     double timeLib = clock();
  203.  
  204.     // Сортируем массив
  205.     sort(vec.begin(), vec.end());
  206.  
  207.     // Получим интервал времени, за который выполнится библиотечная сортировка
  208.     timeLib = (clock() - timeLib) / CLOCKS_PER_SEC;
  209.  
  210.     cout << "Sorted vector by library function:" << endl;
  211.     printVector(vec);
  212.     cout << "Vector is sorted by library function in " << timeLib << " sec" << endl << endl;
  213.  
  214.     double timeDifference = timeOfShellSort - timeLib;
  215.     cout << "Вifference between sorting Shell's function and library function is " << timeDifference << " sec" << endl << endl;
  216.  
  217.  
  218.  
  219.     system("pause");
  220.  
  221.     return 0;
  222. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement