38#include <gtest/gtest.h>
58template <
class Compare>
62 vector<size_t> ref(values.size());
63 for (
size_t i = 0; i < ref.size(); ++i)
66 std::stable_sort(ref.begin(), ref.end(), [&values, &
cmp](
size_t i,
size_t j)
68 return cmp(values[i], values[j]);
76 const vector<size_t> &ref)
79 for (
size_t i = 0; i < ref.size(); ++i)
80 EXPECT_EQ(idx(i), ref[i]) <<
"position " << i;
83template <
class Compare>
86 constexpr size_t max_n = 7;
89 for (
size_t n = 0; n <=
max_n; ++n)
92 for (
size_t i = 0; i < n; ++i)
97 vector<int> values(n);
99 for (
size_t i = 0; i < n; ++i)
101 values[i] =
static_cast<int>(x %
alphabet);
144 for (
int x : {5, 2, 8, 1, 9, 3, 7, 4, 6, 0})
165 int values[] = {5, 2, 8, 1, 9, 3, 7, 4, 6, 0};
166 for (
size_t i = 0; i < 10; ++i)
188 int values[] = {5, 2, 8, 1, 9, 3, 7, 4, 6, 0};
215 sorted.for_each([&prev](
int x) {
223 auto sorted =
sort(list, std::greater<int>());
227 sorted.for_each([&prev](
int x) {
252 list.for_each([&prev](
int x) {
315 auto sorted =
sort(list, std::greater<int>());
318 sorted.for_each([&prev](
int x) {
350 for (
size_t i = 1; i <
sorted.size(); ++i)
358 for (
size_t i = 1; i <
sorted.size(); ++i)
380 for (
size_t i = 1; i < arr.size(); ++i)
416 for (
size_t i = 1; i <
sorted.size(); ++i)
431 for (
size_t i = 1; i < arr.size(); ++i)
441 std::vector<int> v = {5, 2, 8, 1, 9};
450 std::vector<int> v = {5, 2, 8, 1, 9};
457 std::deque<int> d = {5, 2, 8, 1, 9};
464 std::vector<int> empty;
510 vector<int> values = {30, 10, 20};
534 vector<int> values = {10, 30, 20};
536 auto idx =
argsort(values, std::greater<int>());
558 for (
size_t i = 0; i < idx.size(); ++i)
604 vector<int> values = {2, 1, 2, 1, 2};
618 vector<int> values(64, 7);
623 for (
size_t i = 0; i < idx.size(); ++i)
630 for (
size_t i = 0; i < 75; ++i)
631 values.push_back(
static_cast<int>((i * 17) % 5));
636 for (
size_t i = 1; i < idx.size(); ++i)
638 ASSERT_LE(values[idx(i - 1)], values[idx(i)]);
639 if (values[idx(i - 1)] == values[idx(i)])
656 vector<int> values = {1, 3, 2, 3, 2};
682 for (
size_t i = 0; i < idx.size(); ++i)
768 for (
size_t i = 0; i < 5; ++i)
769 arr(i) =
static_cast<int>(i);
773 for (
size_t i = 0; i < 5; ++i)
781 for (
size_t i = 0; i < 5; ++i)
782 arr(i) =
static_cast<int>(4 - i);
786 for (
size_t i = 0; i < 5; ++i)
805 std::vector<size_t>
seen(
r.size(), 0);
806 for (
size_t i = 0; i <
r.size(); ++i)
811 for (
size_t k = 0;
k <
seen.size(); ++
k)
815 for (
size_t i = 0; i < arr.
size(); ++i)
816 for (
size_t j = 0; j < arr.
size(); ++j)
890 std::vector<int>
keys = {3, 1, 2};
891 std::vector<std::string> names = {
"Charlie",
"Alice",
"Bob"};
896 EXPECT_EQ(names, (std::vector<std::string>{
"Alice",
"Bob",
"Charlie"}));
901 std::vector<int>
ids = {3, 1, 2};
902 std::vector<std::string> names = {
"Charlie",
"Alice",
"Bob"};
903 std::vector<int>
ages = {30, 25, 28};
908 EXPECT_EQ(names, (std::vector<std::string>{
"Alice",
"Bob",
"Charlie"}));
914 std::vector<int>
keys = {1, 2, 3};
915 std::vector<char> values = {
'a',
'b',
'c'};
920 EXPECT_EQ(values, (std::vector<char>{
'c',
'b',
'a'}));
925 std::vector<int>
keys;
926 std::vector<int> values;
937 std::vector<int>
keys = {42};
938 std::vector<std::string> values = {
"answer"};
943 EXPECT_EQ(values, (std::vector<std::string>{
"answer"}));
948 std::vector<int>
keys = {2, 1, 2, 1, 2};
949 std::vector<char> aux = {
'a',
'b',
'c',
'd',
'e'};
955 EXPECT_EQ(aux, (std::vector<char>{
'b',
'd',
'a',
'c',
'e'}));
960 std::vector<int>
keys = {1, 2, 3, 4, 5};
961 std::vector<int> values = {10, 20, 30, 40, 50};
966 EXPECT_EQ(values, (std::vector<int>{10, 20, 30, 40, 50}));
971 std::mt19937
rng(123456u);
972 std::uniform_int_distribution<int>
key_dist(0, 5);
976 const size_t n = 100;
977 std::vector<int>
keys(n);
978 std::vector<size_t> pos(n);
979 for (
size_t i = 0; i < n; ++i)
987 for (
size_t i = 1; i < n; ++i)
998 std::mt19937
rng(78910u);
999 std::uniform_int_distribution<int>
key_dist(0, 5);
1001 const size_t n = 200;
1002 std::vector<int>
keys(n);
1003 std::vector<size_t> pos(n);
1004 for (
size_t i = 0; i < n; ++i)
1012 for (
size_t i = 1; i < n; ++i)
1015 std::vector<size_t>
seen(n, 0);
1021 for (
size_t k = 0;
k < n; ++
k)
1027 std::vector<int>
keys = {5, 4, 3, 2, 1};
1028 std::vector<int> values = {50, 40, 30, 20, 10};
1033 EXPECT_EQ(values, (std::vector<int>{10, 20, 30, 40, 50}));
1038 std::vector<int>
keys = {1, 2};
1039 std::vector<int> values = {10};
1042 std::invalid_argument);
1065 std::vector<int>
keys = {2, 1, 2, 1, 2};
1066 std::vector<char> aux = {
'a',
'b',
'c',
'd',
'e'};
1071 EXPECT_EQ(aux, (std::vector<char>{
'b',
'd',
'a',
'c',
'e'}));
1076 std::vector<int>
keys = {2, 1, 2, 1, 2};
1077 std::vector<char> aux = {
'a',
'b',
'c',
'd',
'e'};
1088 std::vector<std::string>
keys = {
"banana",
"apple",
"banana",
"apple"};
1089 std::vector<int> values = {2, 1, 3, 4};
1093 EXPECT_EQ(
keys, (std::vector<std::string>{
"banana",
"banana",
"apple",
"apple"}));
1135 for (
int i = 999; i >= 0; --i)
1148 for (
size_t i = 0; i < 1000; ++i)
1149 arr(i) =
static_cast<int>(999 - i);
1153 for (
size_t i = 1; i < arr.
size(); ++i)
1160 for (
int i = 0; i < 100; ++i)
1166 sorted.for_each([](
int x) {
1188 arr(0) = 1; arr(1) = 2; arr(2) = 3; arr(3) = 4; arr(4) = 5;
1192 return std::abs(a - 3) < std::abs(b - 3);
High-level sorting functions for Aleph containers.
TEST_F(DynListSortTest, SortReturnsSortedCopy)
Simple dynamic array with automatic resizing and functional operations.
constexpr size_t size() const noexcept
Return the number of elements stored in the stack.
T & append(const T &data)
Append a copy of data
T & touch(const size_t i)
Touch the entry i.
size_t size() const noexcept
Return the current dimension of array.
void reserve(const size_t l, const size_t r)
Allocate a range of entries.
Dynamic doubly linked list with O(1) size and bidirectional access.
T & append(const T &item)
Append a copied item at the end of the list.
Doubly-linked list (defined in tpl_dynList.H).
T & append(const T &item)
Array< int > build_array(std::initializer_list< int > items)
DynArray< int > build_array(std::initializer_list< int > items)
DynDlist< int > build_list(std::initializer_list< int > items)
DynList< int > build_list(std::initializer_list< int > items)
int cmp(const __gmp_expr< T, U > &expr1, const __gmp_expr< V, W > &expr2)
size_t blossom_maximum_cardinality_matching(const GT &g, DynDlist< typename GT::Arc * > &matching, SA sa=SA())
Alias of compute_maximum_cardinality_general_matching().
Main namespace for Aleph-w library functions.
bool is_sorted(const Container< T > &cont, const Compare &cmp=Compare())
Check if a container is sorted in ascending order.
Array< size_t > stable_build_index(const C &a, const Compare &cmp=Compare())
Build a stable index array for indirect sorting.
auto pair_ranks(const Array< T > &c)
Computes (value, rank) pairs for each element in an Array.
Array< size_t > stable_argsort(const C &a, const Compare &cmp=Compare())
Return stable sorted-order indices for an array-like container.
DynArray< T > sort(const DynArray< T > &a, Cmp &&cmp=Cmp())
Returns a sorted copy of a DynArray.
Array< size_t > build_index(const C &a, const Compare &cmp=Compare())
Build an index array for indirect sorting.
std::string code(Node *root)
Compute a string with the Lukasiewicz`s word of a tree.
DynArray< T > & in_place_sort(DynArray< T > &c, Cmp cmp=Cmp())
Sorts a DynArray in place.
Array< size_t > ranks(const Array< T > &array)
Computes the rank of each element in an Array.
Array< size_t > argsort(const C &a, const Compare &cmp=Compare())
Return indices that visit an array-like container in sorted order.
Container stdsort(const Container &c, Cmp cmp=Cmp())
Sorts an STL-compatible container using std::sort.
void in_place_multisort_arrays(Cmp cmp, const bool stable, C &first, Args &... args)
Sorts multiple arrays in place, using the first array as the key.
Array< T > build_array(Args... args)
Lazy and scalable dynamic array implementation.
Dynamic doubly linked list implementation.
Alias for htlist.H (DynList implementation).