Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <vector>
- #include <iostream>
- #include <algorithm>
- #include <cmath>
- #include <string>
- #include <set>
- #include <map>
- #include <iomanip>
- #include <time.h>
- #include <stdlib.h>
- using namespace std;
- int ks = 0, kd = 0;
- void selectionSort(vector <int> v, int sz)//Сортировка выбором
- {
- cout << "Start array: "; //Здесь выводим исходный массив
- for (int i = 0; i < sz; ++i)
- cout << v[i] << ' ';
- cout << '\n';
- int last = sz - 1; //Индекс последнего элемента
- kd = 0; ks = 0; //обнуляем кол-во действий и сравнений
- while (last != 0)//пока последний элемент не является превым
- {
- int mx = 0; // позиция для поиска максимума (инзначально считаем, что макс - это первый элем)
- for (int i = 1; i <= last; ++i)//бежим от начала массива до последнего элемента, который не на месте
- {
- ks++;//увеличиваем кол-во сравнений
- if (v[i] > v[mx])//поиск максимума в последовательности (вернее индекс максимального)
- {
- mx = i;
- }
- }
- if (mx != last)//если максимальный элемент в конце, то не меняем
- {
- swap(v[mx], v[last]);//меняем наш максимальный и последний элемент, который не на своём месте
- kd++;
- }
- last--;//уменьшаем кол-во элементов, которые не на своём месте
- //Для массива : 3 2 7 10 12 4 при первой итерации у нас 12 встанет в конец (на своё место), тогда уменьшаем last, так как
- //12 уже на своём месте и так далее, я хуёво объясняю, лучше в инете глянуть
- }
- cout << "Result: ";
- for (int i = 0; i < sz; ++i)
- cout << v[i] << ' ';
- cout << "\nSravnenii : " << ks << "\nDeistvii : " << kd << "\n\n";
- return;
- }
- void puzirkSort(vector <int> v, int sz)//Пузырёк
- {
- cout << "Start array: ";
- for (int i = 0; i < sz; ++i)
- cout << v[i] << ' ';
- cout << '\n';
- kd = 0; ks = 0;
- for (int i = 0; i < sz; ++i)//В этом цикле i - кол-во элементов на своём месте, то есть сколько элементов отсорчено
- {
- for (int j = 1; j < sz - i; ++j)//здесь мы бежим по массиву от начала и до конца - i, то есть не смотрим те элементы, которые на своём месте
- {
- ks++;//считаем кол-во сравнений
- if (v[j - 1] > v[j])//условие обмена (максимальный из двух идёт дальше)
- {
- swap(v[j - 1], v[j]);
- kd++;//считаем действия
- }
- }
- }
- cout << "Result: ";
- for (int i = 0; i < sz; ++i)
- cout << v[i] << ' ';
- cout << "\nSravnenii : " << ks << "\nDeistvii : " << kd << "\n\n";
- return;
- }
- void updatedPuzirkSort(vector <int> v, int sz)//такой же как пузырёк, только с одним улучшением, опишу дальше
- {
- cout << "Start array: ";
- for (int i = 0; i < sz; ++i)
- cout << v[i] << ' ';
- cout << '\n';
- kd = 0; ks = 0;
- for (int i = 0; i < sz; ++i)
- {
- bool swapped(0);//вот! Это флаг, который указывает, был ли совершён обмен, если при каком-то проходе обмен не был совершён,
- //то последовательность уже отсортирована
- for (int j = 1; j < sz - i; ++j)
- {
- ks++;//считаем сравнения
- if (v[j - 1] > v[j])
- {
- swapped = 1;//поднимаем флаг обмена
- swap(v[j - 1], v[j]);//меняем
- kd++;//считаем действия
- }
- }
- if (!swapped)//проверка на то, был ли совершён обмен
- break;
- }
- cout << "Result: ";
- for (int i = 0; i < sz; ++i)
- cout << v[i] << ' ';
- cout << "\nSravnenii : " << ks << "\nDeistvii : " << kd << "\n\n";
- //P.S. эта сортировка лучше только в том случае, когда последовательность частично отсорчена
- return;
- }
- void shakerSort(vector <int> v, int sz)// Это та же сортировка, что и улучшенный пузырь, только после того, как переместили максимальный элемент
- { // движемся обратно и ставим на своё место минимальный
- cout << "Start array: ";
- for (int i = 0; i < sz; ++i)
- cout << v[i] << ' ';
- cout << '\n';
- kd = 0; ks = 0;
- int left(0), right(sz - 1); // тут границы, до которых все стоит на своих местах, изначально 0 и конец
- while (true)//Бесконечный цикл, условие выхода ниже
- {
- bool swapped(false);//флаг как в улучшенном пузырьке
- for (int i = left; i < right; ++i)//в этом цикле как и выше ставим на место максимальный
- {
- ks++;
- if (v[i] > v[i + 1])
- {
- swapped = 1;
- kd++;
- swap(v[i], v[i + 1]);
- }
- }
- right--;//уменьшаем это, так как у нас ещё один элемент встаёт на место
- if (left < right && swapped) //далее смотрим, если у нас правая и левая граница не пересеклись и мы свапались (то есть последовательность неотсорчена)
- { // то движемся влево, чтобы поставить минимум на место
- swapped = 0;//обнуляем флаг
- for (int i = right; i > left; --i)//движемся от последнего неотсорченного до первого отсорченного (справа налево)
- {
- ks++;
- if (v[i] < v[i - 1])
- {
- swapped = 1;
- kd++;
- swap(v[i], v[i - 1]);
- }
- }
- left++;//увеличиваем левую границу, так как ещё одно число встало на место
- if (!swapped || right == left) // если не свапали (то есть ничего не надо было менять), то последовательность отсорчена или правая и левая граница
- break; //пересеклись то мы прошли по все элементам, значит всё отсортировали
- }
- else //141 строчка, если она не выполняется, то последовательность отсорчена
- break;
- }
- cout << "Result: ";
- for (int i = 0; i < sz; ++i)
- cout << v[i] << ' ';
- cout << "\nSravnenii : " << ks << "\nDeistvii : " << kd << "\n\n";
- return;
- }
- void sortvst(vector <int> v, int sz) //Сортировка вставкой
- {
- cout << "Start array: ";
- for (int i = 0; i < sz; ++i)
- cout << v[i] << ' ';
- cout << '\n';
- ks = 0; kd = 0;
- for (int i = 1; i < sz; ++i)
- {
- int zn = v[i], j = i - 1;
- while (j >= 0 && zn < v[j])
- {
- ks++;
- v[j + 1] = v[j];
- kd++;
- j--;
- }
- v[j + 1] = zn;
- kd++;
- }
- cout << "Result: ";
- for (int i = 0; i < sz; ++i)
- cout << v[i] << ' ';
- cout << "\nSravnenii : " << ks << "\nDeistvii : " << kd << "\n\n";
- return;
- }
- int main()
- {
- setlocale(LC_ALL, "Russian");
- int sz;
- cout << "Input size of array: ";
- cin >> sz;
- vector <int> v(sz);
- srand(time(NULL));
- for (int i = 0; i < sz; ++i)
- {
- v[i] = rand() % 100;
- cout << v[i] << ' ';
- }
- int type;
- cout << "\nSelect type of sort:\n\t(1)Viborom\n\t(2)Puzirkom\n\t(3)Uluchshenim puzirkom\n\t(4)Shekernya\n\t(5)Vstavkoi\n";
- cin >> type;
- while (type)
- {
- switch (type)
- {
- case 1: selectionSort(v, sz); break;
- case 2: puzirkSort(v, sz); break;
- case 3: updatedPuzirkSort(v, sz); break;
- case 4: shakerSort(v, sz); break;
- case 5: sortvst(v, sz); break;
- }
- cout << "Select type of sort again(if you need):\n\t(0)Exit\n\t(1)Viborom\n\t(2)Puzirkom\n\t(3)Uluchshenim puzirkom\n\t(4)Shekernya\n\t(5)Vstavkoi\n";
- cin >> type;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement