| Line | Branch | Exec | Source |
|---|---|---|---|
| 1 | #include "mityaeva_radix/seq/include/sorter_seq.hpp" | ||
| 2 | |||
| 3 | #include <algorithm> | ||
| 4 | #include <cstddef> | ||
| 5 | #include <vector> | ||
| 6 | |||
| 7 | namespace mityaeva_radix { | ||
| 8 | 704 | void SorterSeq::CountingSortAsc(std::vector<double> &source, std::vector<double> &destination, int byte) { | |
| 9 | auto *mas = reinterpret_cast<unsigned char *>(source.data()); | ||
| 10 | 704 | std::vector<int> counter(256, 0); | |
| 11 | auto size = source.size(); | ||
| 12 |
2/2✓ Branch 0 taken 18240 times.
✓ Branch 1 taken 704 times.
|
18944 | for (std::size_t i = 0; i < size; i++) { |
| 13 | 18240 | counter[mas[(8 * i) + byte]]++; | |
| 14 | } | ||
| 15 | int j = 0; | ||
| 16 |
1/2✓ Branch 0 taken 27264 times.
✗ Branch 1 not taken.
|
27264 | for (; j < 256; j++) { |
| 17 |
2/2✓ Branch 0 taken 26560 times.
✓ Branch 1 taken 704 times.
|
27264 | if (counter[j] != 0) { |
| 18 | break; | ||
| 19 | } | ||
| 20 | } | ||
| 21 | 704 | int tem = counter[j]; | |
| 22 | 704 | counter[j] = 0; | |
| 23 | 704 | j++; | |
| 24 |
2/2✓ Branch 0 taken 152960 times.
✓ Branch 1 taken 704 times.
|
153664 | for (; j < 256; j++) { |
| 25 | 152960 | int b = counter[j]; | |
| 26 | 152960 | counter[j] = tem; | |
| 27 | 152960 | tem += b; | |
| 28 | } | ||
| 29 |
2/2✓ Branch 0 taken 18240 times.
✓ Branch 1 taken 704 times.
|
18944 | for (std::size_t i = 0; i < size; i++) { |
| 30 | 18240 | destination[counter[mas[(8 * i) + byte]]] = source[i]; | |
| 31 | 18240 | counter[mas[(8 * i) + byte]]++; | |
| 32 | } | ||
| 33 | 704 | } | |
| 34 | |||
| 35 | 704 | void SorterSeq::CountingSortDesc(std::vector<double> &source, std::vector<double> &destination, int byte) { | |
| 36 | auto *mas = reinterpret_cast<unsigned char *>(source.data()); | ||
| 37 | 704 | std::vector<int> count(256, 0); | |
| 38 | auto size = source.size(); | ||
| 39 |
2/2✓ Branch 0 taken 17408 times.
✓ Branch 1 taken 704 times.
|
18112 | for (std::size_t i = 0; i < size; i++) { |
| 40 | 17408 | count[mas[(8 * i) + byte]]++; | |
| 41 | } | ||
| 42 | int sum = 0; | ||
| 43 |
1/4✓ Branch 1 taken 704 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
|
704 | std::vector<int> pos(256, 0); |
| 44 |
2/2✓ Branch 0 taken 180224 times.
✓ Branch 1 taken 704 times.
|
180928 | for (int i = 255; i >= 0; i--) { |
| 45 | 180224 | sum += count[i]; | |
| 46 | 180224 | pos[i] = sum - count[i]; | |
| 47 | } | ||
| 48 |
2/2✓ Branch 0 taken 17408 times.
✓ Branch 1 taken 704 times.
|
18112 | for (std::size_t i = 0; i < size; i++) { |
| 49 | 17408 | int byte_val = mas[(8 * i) + byte]; | |
| 50 | 17408 | destination[pos[byte_val]] = source[i]; | |
| 51 | 17408 | pos[byte_val]++; | |
| 52 | } | ||
| 53 | 704 | } | |
| 54 | |||
| 55 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 88 times.
|
96 | void SorterSeq::LSDSortDouble(std::vector<double> &inp) { |
| 56 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 88 times.
|
96 | if (inp.size() <= 1) { |
| 57 | 8 | return; | |
| 58 | } | ||
| 59 | auto count_negative = std::ranges::count_if(inp, [](auto x) { return x < 0; }); | ||
| 60 | 88 | std::vector<double> negative; | |
| 61 |
1/2✓ Branch 1 taken 88 times.
✗ Branch 2 not taken.
|
88 | negative.reserve(count_negative); |
| 62 |
1/2✓ Branch 1 taken 88 times.
✗ Branch 2 not taken.
|
88 | std::vector<double> positive; |
| 63 |
1/2✓ Branch 1 taken 88 times.
✗ Branch 2 not taken.
|
88 | positive.reserve(inp.size() - count_negative); |
| 64 |
2/2✓ Branch 0 taken 4456 times.
✓ Branch 1 taken 88 times.
|
4544 | for (auto x : inp) { |
| 65 |
2/2✓ Branch 0 taken 2176 times.
✓ Branch 1 taken 2280 times.
|
4456 | if (x < 0) { |
| 66 | negative.push_back(x); | ||
| 67 | } else { | ||
| 68 | positive.push_back(x); | ||
| 69 | } | ||
| 70 | } | ||
| 71 |
2/6✓ Branch 1 taken 88 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 88 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
|
88 | std::vector<double> out_n(negative.size()); |
| 72 |
1/4✓ Branch 1 taken 88 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
|
88 | std::vector<double> out_p(positive.size()); |
| 73 |
2/2✓ Branch 0 taken 704 times.
✓ Branch 1 taken 88 times.
|
792 | for (int i = 0; i < 8; i++) { |
| 74 |
2/2✓ Branch 0 taken 352 times.
✓ Branch 1 taken 352 times.
|
704 | if (i % 2 == 0) { |
| 75 |
1/2✓ Branch 1 taken 352 times.
✗ Branch 2 not taken.
|
352 | CountingSortDesc(negative, out_n, i); |
| 76 |
1/2✓ Branch 1 taken 352 times.
✗ Branch 2 not taken.
|
352 | CountingSortAsc(positive, out_p, i); |
| 77 | } else { | ||
| 78 |
1/2✓ Branch 1 taken 352 times.
✗ Branch 2 not taken.
|
352 | CountingSortDesc(out_n, negative, i); |
| 79 |
1/2✓ Branch 1 taken 352 times.
✗ Branch 2 not taken.
|
352 | CountingSortAsc(out_p, positive, i); |
| 80 | } | ||
| 81 | } | ||
| 82 | inp.clear(); | ||
| 83 |
1/2✓ Branch 1 taken 88 times.
✗ Branch 2 not taken.
|
88 | inp.insert(inp.begin(), negative.begin(), negative.end()); |
| 84 |
1/2✓ Branch 0 taken 88 times.
✗ Branch 1 not taken.
|
88 | inp.insert(inp.end(), positive.begin(), positive.end()); |
| 85 | }; | ||
| 86 | |||
| 87 | } // namespace mityaeva_radix | ||
| 88 |