From 3f17426cc8362cf49cff0a519354da731278a358 Mon Sep 17 00:00:00 2001 From: yosyo Date: Sat, 30 Aug 2025 13:51:34 +0200 Subject: [PATCH] =?UTF-8?q?=E3=80=8C=F0=9F=8F=97=EF=B8=8F=E3=80=8D=20wip(e?= =?UTF-8?q?x02=20code=20kinda=20done=20=3F=20just=20have=20to=20make=20it?= =?UTF-8?q?=20readable=20before=20push=20i=20suppose):=20work=20in=20progr?= =?UTF-8?q?ess,=20not=20done=20yet.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ex02/Makefile | 58 ++++++++++++++++++++++++ ex02/PmergeMe.hpp | 110 ++++++++++++++++++++++++++++++++++++++++++++++ ex02/main.cpp | 77 ++++++++++++++++++++++++++++++++ 3 files changed, 245 insertions(+) create mode 100644 ex02/Makefile create mode 100644 ex02/PmergeMe.hpp create mode 100644 ex02/main.cpp diff --git a/ex02/Makefile b/ex02/Makefile new file mode 100644 index 0000000..7610cf1 --- /dev/null +++ b/ex02/Makefile @@ -0,0 +1,58 @@ +# **************************************************************************** # +# # +# ::: :::::::: # +# Makefile :+: :+: :+: # +# +:+ +:+ +:+ # +# By: mmoussou +#include +#include +#include +#include +#include +#include +#include +#include + +std::vector generateJacobsthal(size_t n) +{ + std::vector seq; + if (n == 0) + return seq; + seq.push_back(0); + if (n == 1) + return seq; + seq.push_back(1); + size_t j0 = 0, j1 = 1; + while (true) + { + size_t jn = j1 + 2 * j0; + if (jn >= n) + break; + seq.push_back(jn); + j0 = j1; + j1 = jn; + } + return seq; +} + +template +struct Pair { + T first; + T second; +}; + +template +struct PairComp { + bool operator()(const Pair &x, const Pair &y) const + { + return x.second < y.second; + } +}; + +template +Container fordJohnsonSort(const Container &input) +{ + typedef typename Container::value_type T; + Container result; + + if (input.size() <= 1) + return input; + + std::vector > pairs; + size_t i = 0; + for (; i + 1 < input.size(); i += 2) + { + T a = input[i]; + T b = input[i+1]; + if (a > b) + std::swap(a, b); + Pair p; + p.first = a; + p.second = b; + pairs.push_back(p); + } + + std::sort(pairs.begin(), pairs.end(), PairComp()); + + for (size_t k = 0; k < pairs.size(); ++k) + result.push_back(pairs[k].second); + + std::vector order = generateJacobsthal(pairs.size()); + std::vector inserted(pairs.size(), false); + + for (size_t idx = 0; idx < order.size(); ++idx) + { + size_t j = order[idx]; + if (j < pairs.size() && !inserted[j]) + { + typename Container::iterator pos = std::lower_bound( + result.begin(), result.end(), pairs[j].first); + result.insert(pos, pairs[j].first); + inserted[j] = true; + } + } + + for (size_t j = 0; j < pairs.size(); ++j) + { + if (!inserted[j]) + { + typename Container::iterator pos = std::lower_bound( + result.begin(), result.end(), pairs[j].first); + result.insert(pos, pairs[j].first); + } + } + + if (i < input.size()) + { + T leftover = input[i]; + typename Container::iterator pos = std::lower_bound(result.begin(), result.end(), leftover); + result.insert(pos, leftover); + } + + return result; +} diff --git a/ex02/main.cpp b/ex02/main.cpp new file mode 100644 index 0000000..23ce125 --- /dev/null +++ b/ex02/main.cpp @@ -0,0 +1,77 @@ +#include "PmergeMe.hpp" + +bool isPositiveInteger(const std::string &s) { + if (s.empty()) return false; + for (size_t i = 0; i < s.size(); i++) { + if (!isdigit(s[i])) return false; + } + return true; +} + +int main(int argc, char **argv) +{ + if (argc < 2) { + std::cerr << "Error" << std::endl; + return 1; + } + + std::vector vec; + std::deque deq; + + for (int i = 1; i < argc; ++i) + { + std::string arg(argv[i]); + if (!isPositiveInteger(arg)) { + std::cerr << "Error" << std::endl; + return 1; + } + std::istringstream iss(arg); + long num; + iss >> num; + if (num < 0 || num > INT_MAX) { + std::cerr << "Error" << std::endl; + return 1; + } + vec.push_back(static_cast(num)); + deq.push_back(static_cast(num)); + } + + // Print before + std::cout << "Before: "; + for (size_t i = 0; i < vec.size() && i < 6; i++) + std::cout << vec[i] << " "; + + if (vec.size() > 6) + std::cout << "[...]"; + std::cout << std::endl; + + // Sort vector + clock_t startVec = clock(); + vec = fordJohnsonSort(vec); + clock_t endVec = clock(); + + // Sort deque + clock_t startDeq = clock(); + deq = fordJohnsonSort(deq); + clock_t endDeq = clock(); + + // Print after + std::cout << "After: "; + for (size_t i = 0; i < vec.size() && i < 6; i++) + std::cout << vec[i] << " "; + + if (vec.size() > 6) + std::cout << "[...]"; + std::cout << std::endl; + + double vecTime = (double)(endVec - startVec) / CLOCKS_PER_SEC * 1e6; + double deqTime = (double)(endDeq - startDeq) / CLOCKS_PER_SEC * 1e6; + + std::cout << "Time to process a range of " << vec.size() + << " elements with std::vector : " << vecTime << " us" << std::endl; + + std::cout << "Time to process a range of " << deq.size() + << " elements with std::deque : " << deqTime << " us" << std::endl; + + return 0; +}