diff --git a/README.md b/README.md index e5c7dd6..ff0926f 100644 --- a/README.md +++ b/README.md @@ -2,8 +2,13 @@ Итого: -1. Сортировка вставками. -2. Нахождение наибольшего общего делителя. -3. Нахождение все простых множителей заданного числа. (в работе) -4. Сортировка слиянием. (в работе) -5. Возведение в степень. +В работе (tmp): +- Нахождение все простых множителей заданного числа. +- Сортировка слиянием. +- Сортировка вставками. +- Нахождение наибольшего общего делителя. +- Возведение в степень. +- Проверка на простоту числа. +- Нахождение всех простых числе до заданного. + +Рассмотрены diff --git a/bin/main.cpp b/bin/main.cpp index 9dd6f7c..55bf429 100644 --- a/bin/main.cpp +++ b/bin/main.cpp @@ -1,50 +1,50 @@ #include -#include "base/insertion_sort.hpp" -#include "base/merge_sort.hpp" -#include "base/merge_sort.v2.hpp" - -#include "numbers/gcd.hpp" -#include "numbers/prime_factors.hpp" -#include "numbers/pow.hpp" -#include "numbers/is_prime.hpp" +#include "sort/insertion.hpp" auto main() -> int { { - hack::log()(alg::is_prime(2)); - return 1; - } - - { - hack::log()(alg::pow(3.0, 2), alg::pow(3.0, 3)); - } - - { - std::vector v { 5, 4, 1, 5, 6 }; - alg::insertion_sort(v); + std::vector v { 5, 4, 1, 3, 6, 9, 7, 2, 8, 0, 10 }; + // alg::sort::insertion(v, 0, v.size() - 1); + alg::sort::insertion(v); hack::log()(v); + return 0; } - { - std::vector v { 16, 7, 10, 1, 5, 11, 3, 8, 14, 4, 2, 12, 6, 13, 9, 15 }; - alg_v2::merge_sort(v); - hack::log()(v); - } - - { - hack::log()(alg::gcd(4851, 3003)); - hack::log()(alg::gcd(64, 28)); - } - - { - hack::log()(alg::prime_factors_v1(127)); - hack::log()(alg::prime_factors_v1(128)); - hack::log()(alg::prime_factors_v1(130)); - - hack::log()(alg::prime_factors_v2(127)); - hack::log()(alg::prime_factors_v2(128)); - hack::log()(alg::prime_factors_v2(130)); - } + // { + // hack::log()(alg::find_primes(50)); + // return 1; + // } + // + // { + // hack::log()(alg::is_prime(2)); + // } + // + // { + // hack::log()(alg::pow(3.0, 2), alg::pow(3.0, 3)); + // } + // + // + // { + // std::vector v { 16, 7, 10, 1, 5, 11, 3, 8, 14, 4, 2, 12, 6, 13, 9, 15 }; + // alg_v2::merge_sort(v); + // hack::log()(v); + // } + // + // { + // hack::log()(alg::gcd(4851, 3003)); + // hack::log()(alg::gcd(64, 28)); + // } + // + // { + // hack::log()(alg::prime_factors_v1(127)); + // hack::log()(alg::prime_factors_v1(128)); + // hack::log()(alg::prime_factors_v1(130)); + // + // hack::log()(alg::prime_factors_v2(127)); + // hack::log()(alg::prime_factors_v2(128)); + // hack::log()(alg::prime_factors_v2(130)); + // } } diff --git a/src/base/insertion_sort.hpp b/src/base/insertion_sort.hpp deleted file mode 100644 index c2517aa..0000000 --- a/src/base/insertion_sort.hpp +++ /dev/null @@ -1,26 +0,0 @@ -#pragma once - -#include -#include - -// Сортировка вставкой -// Эффективна на мелких массивах. Сложнгость O(N^2) -namespace alg -{ - inline void insertion_sort(std::vector& v) - { - for (std::size_t i = 1; i < v.size(); ++i) - { - auto key = v[i]; - auto j = i; - - while (j > 0 && v[j - 1] > key) - { - v[j] = v[j - 1]; - --j; - } - v[j] = key; - } - } -} - diff --git a/src/meson.build b/src/meson.build index 6cb6931..91367e0 100644 --- a/src/meson.build +++ b/src/meson.build @@ -1,9 +1,6 @@ inc += include_directories('.') -headers = [ - 'base/insertion_sort.hpp', - 'numbers/gcd.hpp', - 'numbers/prime_factors.hpp' +headers = [ ] sources = [ @@ -17,9 +14,9 @@ lib = library( cpp_args: args ) -dsp_sdk_dep = declare_dependency( +alg_dep = declare_dependency( include_directories: inc, link_with: lib ) -deps += dsp_sdk_dep +deps += alg_dep diff --git a/src/sort/insertion.hpp b/src/sort/insertion.hpp new file mode 100644 index 0000000..aeb9ffe --- /dev/null +++ b/src/sort/insertion.hpp @@ -0,0 +1,43 @@ +#pragma once + +#include + +/* + Сортировка вставками. + Для небольших массивов стабильна и является самой быстрой. Её можно использовать + как вспомогательную при реализации других сортировок. + + Сортировка стабильна, если равные элементы сохраняют свой первоначальный порядок относительно друг друга. + + Смысл следующий: Считаем что элемент с индексом 0 является как бы массивом(1) с уже отсотрированным элементом. + И далее, каждый появляющийся элемент мы сравниваем с элементом из массива(1) и если он меньше, то перемещаем его дальше вглубь массива(1) + При удачном раскладе и небольших данных работает + + В наихудшем случае сложность алгоритма = O(N^2). Т.к. нам нужно будет пробежаться по каждому элементу из масива массивов + + ДОПИСАТЬ ТЕКСТ ДАЛЬШЕ ПРО НАИЛУЧШИЙ И СРЕДНИЙ СЛУЧАЙ + */ +namespace alg::sort +{ + template + void insertion(std::vector& v, std::size_t left, std::size_t right) + { + for (std::size_t i = left + 1; i <= right; ++i) + { + Item e = v[i]; + std::size_t j = i; + while (j > left && e < v[j - 1]) + { + v[j] = v[j - 1]; + --j; + } + v[j] = e; + } + } + + template + void insertion(std::vector& v) + { + insertion(v, 0, v.size() - 1); + } +} diff --git a/src/tmp/numbers/find_primes.hpp b/src/tmp/numbers/find_primes.hpp new file mode 100644 index 0000000..5837fd0 --- /dev/null +++ b/src/tmp/numbers/find_primes.hpp @@ -0,0 +1,30 @@ +#pragma once + +#include + +// находит все простые числа от 0 до n +namespace alg +{ + inline std::vector find_primes(int n) + { + std::vector r; + std::vector is_prime(n + 1, true); + + // 0 и 1 не являются простыми числами + is_prime[0] = is_prime[1] = false; + + // Исключаем все чётные числа, кроме 2 + for (int i = 4; i <= n; i += 2) is_prime[i] = false; + + // Перебираем только нечётные числа, начиная с 3 + for (int p = 3; p * p <= n; p += 2) + if (is_prime[p]) + for (int i = p * p; i <= n; i += 2 * p) is_prime[i] = false; + + for (int p = 3; p <= n; p += 2) + if (is_prime[p]) r.push_back(p); + + return r; + } +} + diff --git a/src/numbers/gcd.hpp b/src/tmp/numbers/gcd.hpp similarity index 100% rename from src/numbers/gcd.hpp rename to src/tmp/numbers/gcd.hpp diff --git a/src/numbers/is_prime.hpp b/src/tmp/numbers/is_prime.hpp similarity index 100% rename from src/numbers/is_prime.hpp rename to src/tmp/numbers/is_prime.hpp diff --git a/src/numbers/pow.hpp b/src/tmp/numbers/pow.hpp similarity index 100% rename from src/numbers/pow.hpp rename to src/tmp/numbers/pow.hpp diff --git a/src/numbers/prime_factors.hpp b/src/tmp/numbers/prime_factors.hpp similarity index 100% rename from src/numbers/prime_factors.hpp rename to src/tmp/numbers/prime_factors.hpp diff --git a/src/base/merge_sort.hpp b/src/tmp/sortings/merge_sort.hpp similarity index 100% rename from src/base/merge_sort.hpp rename to src/tmp/sortings/merge_sort.hpp diff --git a/src/base/merge_sort.v1.hpp b/src/tmp/sortings/merge_sort.v1.hpp similarity index 100% rename from src/base/merge_sort.v1.hpp rename to src/tmp/sortings/merge_sort.v1.hpp diff --git a/src/base/merge_sort.v2.hpp b/src/tmp/sortings/merge_sort.v2.hpp similarity index 100% rename from src/base/merge_sort.v2.hpp rename to src/tmp/sortings/merge_sort.v2.hpp