From 8d938ce12245838503c4ba894613b6232adbabb4 Mon Sep 17 00:00:00 2001 From: DimaVotincev Date: Sun, 12 Apr 2026 13:48:56 +0300 Subject: [PATCH 1/4] seq opt --- .../seq/src/ops_seq.cpp | 68 +++++++++---------- 1 file changed, 32 insertions(+), 36 deletions(-) diff --git a/tasks/votincev_d_radixmerge_sort/seq/src/ops_seq.cpp b/tasks/votincev_d_radixmerge_sort/seq/src/ops_seq.cpp index 85cca66ce..533395e08 100644 --- a/tasks/votincev_d_radixmerge_sort/seq/src/ops_seq.cpp +++ b/tasks/votincev_d_radixmerge_sort/seq/src/ops_seq.cpp @@ -14,78 +14,74 @@ VotincevDRadixMergeSortSEQ::VotincevDRadixMergeSortSEQ(const InType &in) { GetInput() = in; } -// проверка входных данных bool VotincevDRadixMergeSortSEQ::ValidationImpl() { - // проверка: входной вектор не должен быть пустым return !GetInput().empty(); } -// препроцессинг bool VotincevDRadixMergeSortSEQ::PreProcessingImpl() { return true; } -// вспомогательный метод для распределения и слияния разрядов +// поразрядная сортировка void VotincevDRadixMergeSortSEQ::SortByDigit(std::vector &array, int32_t exp) { - std::vector> buckets(10); + size_t n = array.size(); + std::vector output(n); + int32_t count[10] = {0}; - // распределение элементов по корзинам - for (const auto &num : array) { - int32_t digit = (num / exp) % 10; - buckets[digit].push_back(num); + for (size_t i = 0; i < n; i++) { + int32_t digit = (array[i] / exp) % 10; + count[digit]++; } - // простое слияние корзин обратно в рабочий массив - size_t index = 0; - for (int i = 0; i < 10; ++i) { - for (const auto &val : buckets[i]) { - array[index++] = val; - } - // очистка корзины для следующего разряда - buckets[i].clear(); + // префиксные суммы + for (int i = 1; i < 10; i++) { + count[i] += count[i - 1]; } -} -// основной метод алгоритма -bool VotincevDRadixMergeSortSEQ::RunImpl() { - if (GetInput().empty()) { - return false; + // теперь count[i] содержит позицию, перед которой заканчиваются элементы с цифрой i + + // формирую выходной массив + for (int64_t i = n - 1; i >= 0; i--) { + int32_t digit = (array[i] / exp) % 10; + output[count[digit] - 1] = array[i]; + count[digit]--; } - // локальная копия данных для сортировки + array = std::move(output); +} + +bool VotincevDRadixMergeSortSEQ::RunImpl() { std::vector working_array = GetInput(); - // обработка отрицательных чисел - int32_t min_val = *std::ranges::min_element(working_array); + // поиск min и max за один проход + auto [min_it, max_it] = std::minmax_element(working_array.begin(), working_array.end()); + int32_t min_val = *min_it; + int32_t max_val = *max_it; + // сдвиг в положительную область if (min_val < 0) { for (auto &num : working_array) { num -= min_val; } + max_val -= min_val; } - // ищем максимальное число для определения количества разрядов - int32_t max_val = *std::ranges::max_element(working_array); - - // цикл по разрядам (единицы, десятки, сотни...) - for (int32_t exp = 1; max_val / exp > 0; exp *= 10) { - SortByDigit(working_array, exp); + // цикл по разрядам, int64_t для exp, чтобы избежать переполнения при exp * 10 + for (int64_t exp = 1; max_val / exp > 0; exp *= 10) { + SortByDigit(working_array, static_cast(exp)); } - // возвращаем значения к исходному диапазону + // возврат к исходному диапазону if (min_val < 0) { for (auto &num : working_array) { num += min_val; } } - // запись результата в выходные данные - GetOutput() = working_array; - + GetOutput() = std::move(working_array); return true; } -// постпроцессинг bool VotincevDRadixMergeSortSEQ::PostProcessingImpl() { return true; } From a709637e5441f69fa6c8067c8c3bb4d42a0fb0e6 Mon Sep 17 00:00:00 2001 From: DimaVotincev Date: Sun, 12 Apr 2026 15:47:49 +0300 Subject: [PATCH 2/4] clang-tidy fix1 --- .../seq/src/ops_seq.cpp | 25 +++++++++---------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/tasks/votincev_d_radixmerge_sort/seq/src/ops_seq.cpp b/tasks/votincev_d_radixmerge_sort/seq/src/ops_seq.cpp index 533395e08..8904220d6 100644 --- a/tasks/votincev_d_radixmerge_sort/seq/src/ops_seq.cpp +++ b/tasks/votincev_d_radixmerge_sort/seq/src/ops_seq.cpp @@ -1,8 +1,10 @@ #include "votincev_d_radixmerge_sort/seq/include/ops_seq.hpp" #include +#include #include #include +#include #include #include "votincev_d_radixmerge_sort/common/include/common.hpp" @@ -26,25 +28,23 @@ bool VotincevDRadixMergeSortSEQ::PreProcessingImpl() { void VotincevDRadixMergeSortSEQ::SortByDigit(std::vector &array, int32_t exp) { size_t n = array.size(); std::vector output(n); - int32_t count[10] = {0}; + std::array count{}; for (size_t i = 0; i < n; i++) { int32_t digit = (array[i] / exp) % 10; - count[digit]++; + count[static_cast(digit)]++; } // префиксные суммы - for (int i = 1; i < 10; i++) { + for (size_t i = 1; i < 10; i++) { count[i] += count[i - 1]; } - // теперь count[i] содержит позицию, перед которой заканчиваются элементы с цифрой i - // формирую выходной массив - for (int64_t i = n - 1; i >= 0; i--) { - int32_t digit = (array[i] / exp) % 10; - output[count[digit] - 1] = array[i]; - count[digit]--; + for (int64_t i = static_cast(n) - 1; i >= 0; i--) { + int32_t digit = (array[static_cast(i)] / exp) % 10; + output[static_cast(count[static_cast(digit)]) - 1] = array[static_cast(i)]; + count[static_cast(digit)]--; } array = std::move(output); @@ -53,8 +53,7 @@ void VotincevDRadixMergeSortSEQ::SortByDigit(std::vector &array, int32_ bool VotincevDRadixMergeSortSEQ::RunImpl() { std::vector working_array = GetInput(); - // поиск min и max за один проход - auto [min_it, max_it] = std::minmax_element(working_array.begin(), working_array.end()); + auto [min_it, max_it] = std::ranges::minmax_element(working_array); int32_t min_val = *min_it; int32_t max_val = *max_it; @@ -66,8 +65,8 @@ bool VotincevDRadixMergeSortSEQ::RunImpl() { max_val -= min_val; } - // цикл по разрядам, int64_t для exp, чтобы избежать переполнения при exp * 10 - for (int64_t exp = 1; max_val / exp > 0; exp *= 10) { + // цикл по разрядам + for (int64_t exp = 1; static_cast(max_val) / exp > 0; exp *= 10) { SortByDigit(working_array, static_cast(exp)); } From 5d8fc51f41e7c1bfebf689dddfcf5fb944077332 Mon Sep 17 00:00:00 2001 From: DimaVotincev Date: Mon, 13 Apr 2026 18:32:07 +0300 Subject: [PATCH 3/4] clang tidy fix432 --- tasks/votincev_d_radixmerge_sort/seq/src/ops_seq.cpp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/tasks/votincev_d_radixmerge_sort/seq/src/ops_seq.cpp b/tasks/votincev_d_radixmerge_sort/seq/src/ops_seq.cpp index 8904220d6..134c7cf02 100644 --- a/tasks/votincev_d_radixmerge_sort/seq/src/ops_seq.cpp +++ b/tasks/votincev_d_radixmerge_sort/seq/src/ops_seq.cpp @@ -32,19 +32,21 @@ void VotincevDRadixMergeSortSEQ::SortByDigit(std::vector &array, int32_ for (size_t i = 0; i < n; i++) { int32_t digit = (array[i] / exp) % 10; - count[static_cast(digit)]++; + count.at(static_cast(digit))++; } // префиксные суммы for (size_t i = 1; i < 10; i++) { - count[i] += count[i - 1]; + count.at(i) += count.at(i - 1); } // формирую выходной массив for (int64_t i = static_cast(n) - 1; i >= 0; i--) { - int32_t digit = (array[static_cast(i)] / exp) % 10; - output[static_cast(count[static_cast(digit)]) - 1] = array[static_cast(i)]; - count[static_cast(digit)]--; + size_t idx = static_cast(i); + size_t digit = static_cast((array.at(idx) / exp) % 10); + size_t pos = static_cast(count.at(digit)) - 1; + output.at(pos) = array.at(idx); + count.at(digit)--; } array = std::move(output); From 5d4ca7a06104539374ef92e92ad9003118a1bb4e Mon Sep 17 00:00:00 2001 From: DimaVotincev Date: Mon, 13 Apr 2026 19:16:21 +0300 Subject: [PATCH 4/4] clang-tidy fix298453 --- tasks/votincev_d_radixmerge_sort/seq/src/ops_seq.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tasks/votincev_d_radixmerge_sort/seq/src/ops_seq.cpp b/tasks/votincev_d_radixmerge_sort/seq/src/ops_seq.cpp index 134c7cf02..9c016cad9 100644 --- a/tasks/votincev_d_radixmerge_sort/seq/src/ops_seq.cpp +++ b/tasks/votincev_d_radixmerge_sort/seq/src/ops_seq.cpp @@ -42,8 +42,8 @@ void VotincevDRadixMergeSortSEQ::SortByDigit(std::vector &array, int32_ // формирую выходной массив for (int64_t i = static_cast(n) - 1; i >= 0; i--) { - size_t idx = static_cast(i); - size_t digit = static_cast((array.at(idx) / exp) % 10); + auto idx = static_cast(i); + auto digit = static_cast((array.at(idx) / exp) % 10); size_t pos = static_cast(count.at(digit)) - 1; output.at(pos) = array.at(idx); count.at(digit)--;