Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <fstream>
- #include <bitset>
- #include <vector>
- #include <chrono>
- #include <ctime>
- #include <random>
- using namespace std;
- class Stopwatch {
- chrono::steady_clock::time_point point;
- chrono::nanoseconds dim;
- public:
- void start_countdown() {
- point = chrono::steady_clock::now();
- }
- double get_milliseconds() {
- dim = chrono::duration_cast<chrono::nanoseconds>(chrono::steady_clock::now() - point);
- return (double)dim.count() / 1'000'000;
- }
- };
- const int N = 10000000;
- void outSort(fstream& f, bitset<N>* set = nullptr, unsigned int* arr=nullptr);
- void sorting_by_bitset();
- void sorting_by_bitarray();
- void fill_storage_random(int n, bitset<N>* set = nullptr, unsigned int* arr = nullptr);
- int main() {
- srand(time(NULL));
- setlocale(LC_ALL, "rus");
- int answer1 = 100;
- while (answer1 != 0) {
- system("cls");
- cout << "Практическая работа №1 ИКБО-11-21 Резван М.Б. Вариант 28" << endl << endl;
- cout << "Задание 1" << endl;
- cout << "Меню\n";
- cout << "1) Битовая сортировка с помощью bitset\n";
- cout << "2) Битовая сортировка с помощью битового массива\n";
- cout << "0) Выход\n";
- cout << "Ваш выбор: ";
- cin >> answer1;
- system("cls");
- cout << "Практическая работа №1 ИКБО-11-21 Резван М.Б. Вариант 28" << endl << endl;
- switch (answer1)
- {
- case 1:
- sorting_by_bitset();
- system("pause");
- break;
- case 2:
- sorting_by_bitarray();
- system("pause");
- break;
- default:
- break;
- }
- }
- }
- void fill_storage_random(int n, bitset<N>* set , unsigned int* arr ) {
- random_device rd;
- default_random_engine rng(rd());
- uniform_int_distribution<unsigned int> dist(1'000'000, 9'999'999);
- if (set) {
- for (int i = 0; i < n; i++)
- set->set(dist(rng));
- }
- else {
- unsigned int t;
- for (int i = 0; i < n; i++) {
- t = dist(rng);
- arr[t / 32] |= (1 << t % 32);
- }
- }
- }
- void sorting_by_bitset() {
- Stopwatch s;
- bitset<N>* arr = new bitset<N>{ 0 };
- fstream f;
- unsigned int t;
- cout << "Вид входных данных:"
- << "\n1.Ввод с клавиатуры"
- << "\n2.Заполнение случайными числами"
- << "\n3.Чтение из файла";
- cout << "\nВаш ответ: "; cin >> t;
- if (t == 1) {
- int n;
- cout << "Введите кол-во чисел:";
- cin >> n;
- s.start_countdown();
- for (int i = 0; i < n; i++) {
- cin >> t;
- arr->set(t);
- }
- }
- else if (t == 2) {
- int n;
- cout << "Введите кол-во чисел:";
- cin >> n;
- s.start_countdown();
- fill_storage_random(n, arr);
- }
- else if (t == 3) {
- string name;
- cout << "Введите название файла (вместе с расширением): "; cin >> name;
- f.open(name, ios::in);
- s.start_countdown();
- while (f >> t) arr->set(t);
- f.close();
- }
- else {
- cout << "Такого значение нет!(";
- return;
- }
- outSort(f, arr);
- cout << "\nВремя выполнения (bitset): " << s.get_milliseconds() << "ms\n";
- delete arr;
- }
- void sorting_by_bitarray() {
- Stopwatch s;
- fstream f;
- unsigned int t = 0, * arr = new unsigned int[N / 32]{ 0 };
- cout << "Вид входных данных:"
- << "\n1.Ввод с клавиатуры"
- << "\n2.Заполнение случайными числами"
- << "\n3.Чтение из файла";
- cout << "\nВаш ответ: "; cin >> t;
- if (t == 1) {
- int n;
- cout << "Введите кол-во чисел:";
- cin >> n;
- s.start_countdown();
- for (int i = 0; i < n; i++) {
- cin >> t;
- arr[t / 32] |= (1 << t % 32);
- }
- //cout << "fill bit: " << bitset<32>(arr[38580]);
- }
- else if (t == 2) {
- int n;
- cout << "Введите кол-во чисел:";
- cin >> n;
- s.start_countdown();
- fill_storage_random(n, nullptr, arr);
- }
- else if (t == 3) {
- string name;
- cout << "Введите название файла (вместе с расширением): "; cin >> name;
- f.open(name, ios::in);
- s.start_countdown();
- while (f >> t) arr[t / 32] |= (1 << t % 32);
- f.close();
- }
- else {
- cout << "Такого значение нет!(";
- return;
- }
- outSort(f, nullptr, arr);
- cout << "\nВремя выполнения (bitarray): " << s.get_milliseconds() << "ms\n";
- delete[] arr;
- }
- void outSort(fstream& f, bitset<N>* set, unsigned int* arr) {
- if(set){
- f.open("sortS.txt", ios::out);
- for (int i = 0; i < N; i++)
- if (set->test(i) == 1) {
- f << i << '\n';
- cout << i << ' ';
- }
- f.close();
- }
- else {
- f.open("sortA.txt", ios::out);
- for (int i = 0; i < N; i++)
- if ((arr[i / 32] & (1 << i % 32)) != 0) {
- f << i << '\n';
- cout << i << ' ';
- }
- f.close();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement