cpp/CPP09/ex02/main.cpp
2024-12-04 17:29:31 +01:00

125 lines
2.6 KiB
C++

#include <iostream>
#include <cstdlib>
#include <string>
#include <exception>
#include <deque>
#include <vector>
#include <algorithm>
#include <ctime>
#include <climits>
void fillDequeVector(int argc, char **argv, std::deque<int> &deq, std::vector<int> &vec) {
char *endPtr;
for (int i = 1; i < argc; i++) {
long int nbr = std::strtol(argv[i], &endPtr, 10);
if (*endPtr != '\0' || nbr > INT_MAX || nbr < INT_MIN) {
std::cout << "Error: Bad value: " << argv[i] << std::endl;
throw std::exception();
}
deq.push_back(nbr);
vec.push_back(nbr);
}
}
template <typename T>
void binarySearchInsert(T &t, int value) {
int start = 0;
int end = t.size() - 1;
if (t[end] < value) {
t.insert(t.end(), value);
return ;
}
while (true) {
int mid = start - (start - end) / 2;
int cur_value = t[mid];
if (cur_value == value || end - start <= 1) {
if (cur_value < value)
t.insert(t.begin() + mid + 1, value);
else
t.insert(t.begin() + mid, value);
return ;
}
else if (cur_value < value)
start = mid;
else if (cur_value > value)
end = mid;
}
}
template <typename T>
void mergeInsertSort(T &t) {
unsigned int size = t.size();
int min[size / 2];
int all[size];
for (unsigned int i = 0; i < size; i++)
all[i] = t[i];
t.clear();
for (unsigned int i = 0; i + 1 < size; i+=2) {
int maximun = std::max(all[i], all[i + 1]);
int minimun = std::min(all[i], all[i + 1]);
t.push_back(maximun);
int index = i / 2;
min[index] = minimun;
}
std::sort(t.begin(), t.end());
for (unsigned int i = 0; i < size / 2; i++)
binarySearchInsert(t, min[i]);
if (t.size() % 2 == 1)
binarySearchInsert(t, all[size - 1]);
}
int main(int argc, char **argv) {
if (argc <= 2) {
std::cout << "Not enought arguments" << std::endl;
return 1;
}
std::deque<int> deq;
std::vector<int> vec;
try {
fillDequeVector(argc, argv, deq, vec);
}
catch (std::exception &e) {
return 1;
}
std::cout << "Before: ";
for (size_t i = 0; i < deq.size(); i++) {
std::cout << deq[i] << " ";
}
std::cout << "\n";
clock_t clockDeq = clock();
mergeInsertSort(deq);
clockDeq = clock() - clockDeq;
std::cout << "After: ";
for (size_t i = 0; i < deq.size(); i++) {
std::cout << deq[i] << " ";
}
std::cout << "\n";
clock_t clockVec = clock();
mergeInsertSort(vec);
clockVec = clock() - clockVec;
std::cout << "Time to process a range of " << argc - 1 << " elements with std::deque : " << ((double)clockDeq)/ CLOCKS_PER_SEC * 1000.0 << " ms" << std::endl;
std::cout << "Time to process a range of " << argc - 1 << " elements with std::vector : " << ((double)clockVec)/ CLOCKS_PER_SEC * 1000.0 << " ms" << std::endl;
return 0;
}