Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Лабораторная для Безуса №3 вариант 12
- #include<iostream>
- #include<vector>
- #include<string>
- #include<ctime>
- #include<algorithm>
- using namespace std;
- // Рандомно получаем и заполняем вектор
- vector<int> getRandomVec(int sizeOfVector, int x)
- {
- vector<int> vec;
- //Наполняем вектор абсолютно рандомно
- if (x == 0)
- for (int i = 0; i < sizeOfVector; i++)
- {
- vec.push_back(rand());
- }
- //Наполняем вектор с уникальными значениями от 1 до x
- else for (int i = 0; i < sizeOfVector; i++)
- {
- vec.push_back(rand() % x);
- }
- return vec;
- }
- // Делаем копию вектора
- vector<int> getRandomVecCustomSort(vector<int> getRandomVec)
- {
- vector<int> vecCustomSort;
- int sizeOfVector = getRandomVec.size();
- for (int i = 0; i < sizeOfVector; i++)
- {
- getRandomVec.push_back(rand());
- vecCustomSort.push_back(getRandomVec[i]);
- }
- return vecCustomSort;
- }
- // Печатает вектор длиной 10 первых символов, даже если вектор больше
- void printVector(vector<int> vec)
- {
- // Если длина вектора не более 10
- if (vec.size() <= 10)
- for (int i = 0; i < vec.size(); i++)
- {
- cout << vec[i] << ' ';
- }
- // Если длина вектора больше 10
- else for (int i = 0; i < 10; i++)
- {
- cout << vec[i] << ' ';
- }
- cout << endl;
- }
- // Ввод чисел в вектор
- vector<int> inputVector(int sizeOfVector, int x)
- {
- vector<int> vec;
- int number;
- for (int i = 0; i < sizeOfVector; i++) {
- cout << "Input " << i + 1 << " element of array: ";
- cin >> number;
- vec.push_back(number);
- }
- return vec;
- }
- // Проверка на ввод согласия
- int checkYesNo(string yn) {
- if (yn == "Yes" || yn == "YES" || yn == "yes" || yn == "y" ) return 1;
- else if (yn == "No" || yn == "NO" || yn == "no" || yn == "n") return 2;
- else return 0;
- }
- //Согласно выбранному пути, заполняем вектор рандомными значениями или вводимыми пользователем
- vector<int> setChoice(string yn, int x, int sizeOfVector)
- {
- vector<int> vec;
- //Если мы согласны получить рандомный вектор
- if (checkYesNo(yn) == 1)
- {
- vec = getRandomVec(sizeOfVector, x);
- printVector(vec);
- cout << endl;
- }
- //Если мы хотим заполнить ветор сами
- else if (checkYesNo(yn) == 2)
- {
- vec = inputVector(sizeOfVector, x);
- printVector(vec);
- cout << endl;
- }
- return vec;
- }
- // Сортировка Шелла
- vector<int> ShellSort(vector<int> vec)
- {
- int i, j, step;
- int tmp;
- for (step = vec.size() / 2; step > 0; step /= 2)
- for (i = step; i < vec.size(); i++)
- {
- tmp = vec[i];
- for (j = i; j >= step; j -= step)
- {
- if (tmp < vec[j - step])
- vec[j] = vec[j - step];
- else
- break;
- }
- vec[j] = tmp;
- }
- return vec;
- }
- vector<int> firstStep(vector <int> vec)
- {
- vector<int> first = vec;
- int i, j, step;
- int tmp, m;
- for (step = vec.size() / 2; step > 0; step /= 2)
- for (i = step; i < vec.size(); i++)
- {
- tmp = vec[i];
- for (j = i; j >= step; j -= step)
- {
- if (tmp < vec[j - step] && step == first.size() / 2) {
- vec[i] = vec[j - step];
- vec[j - step] = tmp;
- return vec;
- }
- else
- break;
- }
- }
- }
- int main()
- {
- vector<int> vec;
- vector<int> vecCustomSort;
- cout << "Hi, lets sort vector" << endl;
- string yn;
- cout << "Do you want get random vector? [Yes/No]" << endl;
- // Пока мы вводим неправильно Yes/No, программа выкидывает ошибку и просит повторить
- do
- {
- getline(cin, yn);
- if (checkYesNo(yn) == 0)
- cout << "Error! Try again" << endl << "Do you want get random vector? [Yes/No]" << endl << endl;
- } while (checkYesNo(yn) == 0);
- cout << "Enter the number of variables in the vector: ";
- int sizeOfVector;
- cin >> sizeOfVector;
- int x = 0;
- // Если мы хотим создать рандомный массив, то введем число уникальных чисел
- if (checkYesNo(yn) == 1)
- {
- cout << "Enter the number of unique integers (Enter [0] if you do not need it)" << endl;
- cin >> x;
- }
- vec = setChoice(yn, x, sizeOfVector);
- vector<int> fStep = firstStep(vec);
- printVector(fStep);
- cout << endl;
- double timeOfShellSort = clock();
- vecCustomSort = ShellSort(vec);
- timeOfShellSort = (clock() - timeOfShellSort) / CLOCKS_PER_SEC;
- cout << "Sorted by Shell's function:" << endl;
- printVector(vecCustomSort);
- cout << "Vector is sorted by Shell's function in " << timeOfShellSort << " sec" << endl << endl;
- // Получим текущее время
- double timeLib = clock();
- // Сортируем массив
- sort(vec.begin(), vec.end());
- // Получим интервал времени, за который выполнится библиотечная сортировка
- timeLib = (clock() - timeLib) / CLOCKS_PER_SEC;
- cout << "Sorted vector by library function:" << endl;
- printVector(vec);
- cout << "Vector is sorted by library function in " << timeLib << " sec" << endl << endl;
- double timeDifference = timeOfShellSort - timeLib;
- cout << "Вifference between sorting Shell's function and library function is " << timeDifference << " sec" << endl << endl;
- system("pause");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement