From 1370dab0894a5b62be5c831bdf2e7bd71e854173 Mon Sep 17 00:00:00 2001 From: whaffman Date: Wed, 3 Sep 2025 17:52:49 +0200 Subject: [PATCH] Add comparison tracking to PmergeMe sorting; enhance sorting logic and update settings --- .vscode/settings.json | 5 ++++- ex02/inc/PmergeMe.hpp | 2 ++ ex02/src/PmergeMe.cpp | 50 ++++++++++++++++++++++++++++--------------- ex02/src/main.cpp | 4 ++-- 4 files changed, 41 insertions(+), 20 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 3a7b272..271dbab 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -47,6 +47,9 @@ "stdexcept": "cpp", "streambuf": "cpp", "cinttypes": "cpp", - "typeinfo": "cpp" + "typeinfo": "cpp", + "ctime": "cpp", + "iomanip": "cpp", + "sstream": "cpp" } } \ No newline at end of file diff --git a/ex02/inc/PmergeMe.hpp b/ex02/inc/PmergeMe.hpp index 0ca70d1..9e1b3f8 100644 --- a/ex02/inc/PmergeMe.hpp +++ b/ex02/inc/PmergeMe.hpp @@ -25,6 +25,8 @@ private: std::vector _data_vector; std::deque _data_deque; std::vector _jacobstahl_numbers; + bool less(int a, int b); + int _comparisons; bool areAllUnique() const; void insertVector(std::vector &main, std::vector &pend, int start_index, int right, int group_size); diff --git a/ex02/src/PmergeMe.cpp b/ex02/src/PmergeMe.cpp index f71790f..3da7370 100644 --- a/ex02/src/PmergeMe.cpp +++ b/ex02/src/PmergeMe.cpp @@ -8,6 +8,7 @@ #include #include #include +#include std::ostream &operator<<(std::ostream &os, const std::vector &obj) { @@ -21,7 +22,7 @@ std::ostream &operator<<(std::ostream &os, const std::vector &obj) return os; } -PmergeMe::PmergeMe(const int argc, const char **argv) +PmergeMe::PmergeMe(const int argc, const char **argv) : _comparisons(0) { for (int i = 1; argv[i] != nullptr; ++i) { @@ -86,7 +87,10 @@ std::ostream &PmergeMe::operator<<(std::ostream &os) const void PmergeMe::sort() { + _comparisons = 0; sortVector(0); + std::cout << "Total comparisons: " << _comparisons << std::endl; + std::cout << (std::is_sorted(_data_vector.begin(), _data_vector.end()) ? "Sorted!!!" : "ERROR!!") << std::endl; std::sort(_data_deque.begin(), _data_deque.end()); } void PmergeMe::sortVector(int level = 0) @@ -105,7 +109,7 @@ void PmergeMe::sortVector(int level = 0) for (size_t i = 0; i < _data_vector.size(); i += group_size) { - if (_data_vector[i + group_size / 2 - 1] > _data_vector[i + group_size - 1]) + if (!less(_data_vector[i + group_size / 2 - 1], _data_vector[i + group_size - 1])) std::swap_ranges(_data_vector.begin() + i, _data_vector.begin() + i + group_size / 2, _data_vector.begin() + i + group_size / 2); } @@ -117,36 +121,40 @@ void PmergeMe::sortVector(int level = 0) // #3 Separate main and pend group_size /= 2; - main.insert(main.end(), _data_vector.begin(), _data_vector.begin() + group_size); - auto it = _data_vector.begin() + group_size; + main.insert(main.end(), _data_vector.begin(), _data_vector.begin() + group_size); // inserting b1 + auto it = _data_vector.begin() + group_size; // this is a1 while (it != _data_vector.end()) { - if (it + group_size > _data_vector.end()) - group_size = _data_vector.end() - it; + // if (it + group_size > _data_vector.end()) + // group_size = _data_vector.end() - it; main.insert(main.end(), it, it + group_size); it += group_size; if (it == _data_vector.end()) break; - if (it + group_size > _data_vector.end()) - group_size = _data_vector.end() - it; + // if (it + group_size > _data_vector.end()) + // group_size = _data_vector.end() - it; pend.insert(pend.end(), it, it + group_size); it += group_size; } pend.insert(pend.end(), left.begin(), left.end()); int i = 0; - int sorted_in_main = 3; // TODO ?? while (!pend.empty()) { - int jacob_index = Jacobstahl().get(i + 3) - Jacobstahl().get(i + 2); + int sorted_in_main = std::pow(2, i + 2) -1 ; // TODO ?? + sorted_in_main = sorted_in_main > static_cast(main.size() / group_size) ? static_cast(main.size() / group_size) : sorted_in_main; + + int jacob_index = Jacobstahl().get(i + 3) - Jacobstahl().get(i + 2) - 1; int start_index = std::min(jacob_index, static_cast(pend.size() / group_size) - 1); for (int j = start_index; j >= 0; --j) { + insertVector(main, pend, j, sorted_in_main, group_size); - std::cout << "insertVector(main, pend, " << j << ", " << sorted_in_main << ", " << group_size << ")" << std::endl; + // std::cout << "insertVector(main, pend, " << j << ", " << sorted_in_main << ", " << group_size << ")" << std::endl; + // sorted_in_main--; } - sorted_in_main += start_index + 1; // TODO ?? + i++; } _data_vector = main; @@ -175,6 +183,12 @@ std::string PmergeMe::getPrintableDeque() const return result; } +bool PmergeMe::less(int a, int b) +{ + _comparisons++; + return a < b; +} + bool PmergeMe::areAllUnique() const { std::vector temp = _data_vector; // Create a copy @@ -188,11 +202,13 @@ void PmergeMe::insertVector(std::vector &main, std::vector &pend, int if (pend.empty() || start_index < 0 || start_index >= static_cast(pend.size())) return; - std::cout << main << " | " << pend << " | start_index: " << start_index << " | right: " << right << " | group_size: " << group_size << std::endl; - // Use the last element in the group for binary search int value_to_insert = pend[(start_index + 1) * group_size - 1]; - std::cout << "Value to insert: " << value_to_insert << std::endl; + // std::cout << "Value to insert: " << value_to_insert << std::endl; + // std::cout << main << " | " << std::setw(3) << value_to_insert << " | " << pend + // << " | start_index: " << start_index << " | right: " << right + // << " | group_size: " << group_size << (!std::is_sorted(main.begin(), main.end()) && group_size == 1 ? "<<<" : "") + // << std::endl; auto insert_pos = main.begin() + right * group_size; int left = 0; @@ -201,7 +217,7 @@ void PmergeMe::insertVector(std::vector &main, std::vector &pend, int { int mid = left + (right - left) / 2; int last_idx = std::min((mid + 1) * group_size, static_cast(main.size())) - 1; - if (main[last_idx] < value_to_insert) + if (less(main[last_idx], value_to_insert)) { left = mid + 1; } @@ -213,7 +229,7 @@ void PmergeMe::insertVector(std::vector &main, std::vector &pend, int } main.insert(insert_pos, pend.begin() + start_index * group_size, pend.begin() + (start_index + 1) * group_size); - std::cout << "After insertion: " << main << std::endl; + // std::cout << "After insertion: " << main << std::endl; pend.erase(pend.begin() + start_index * group_size, pend.begin() + (start_index + 1) * group_size); } diff --git a/ex02/src/main.cpp b/ex02/src/main.cpp index b276b28..39ae9fa 100644 --- a/ex02/src/main.cpp +++ b/ex02/src/main.cpp @@ -8,9 +8,9 @@ int main(const int argc, const char **argv) try { PmergeMe sorter(argc, argv); - std::cout << "Before sorting:\n" << sorter << std::endl; + // std::cout << "Before sorting:\n" << sorter << std::endl; sorter.sort(); - std::cout << "After sorting:\n" << sorter << std::endl; + // std::cout << "After sorting:\n" << sorter << std::endl; } catch (const std::invalid_argument &e) {