Aleph-w 3.0
A C++ Library for Data Structures and Algorithms
Loading...
Searching...
No Matches
ahSort_test.cc
Go to the documentation of this file.
1
2/*
3 Aleph_w
4
5 Data structures & Algorithms
6 version 2.0.0b
7 https://github.com/lrleon/Aleph-w
8
9 This file is part of Aleph-w library
10
11 Copyright (c) 2002-2026 Leandro Rabindranath Leon
12
13 Permission is hereby granted, free of charge, to any person obtaining a copy
14 of this software and associated documentation files (the "Software"), to deal
15 in the Software without restriction, including without limitation the rights
16 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
17 copies of the Software, and to permit persons to whom the Software is
18 furnished to do so, subject to the following conditions:
19
20 The above copyright notice and this permission notice shall be included in all
21 copies or substantial portions of the Software.
22
23 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
24 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
25 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
26 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
27 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
28 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
29 SOFTWARE.
30*/
31
32
38#include <gtest/gtest.h>
39
40#include <vector>
41#include <deque>
42#include <algorithm>
43#include <random>
44#include <string>
45
46#include <ahSort.H>
47#include <tpl_dynArray.H>
48#include <tpl_dynList.H>
49#include <tpl_dynDlist.H>
50
51using namespace Aleph;
52using namespace std;
53
54// ============================================================================
55// Test Fixtures
56// ============================================================================
57
58class DynListSortTest : public ::testing::Test
59{
60protected:
62
63 void SetUp() override
64 {
65 list = DynList<int>{5, 2, 8, 1, 9, 3, 7, 4, 6, 0};
66 }
67
68 DynList<int> build_list(std::initializer_list<int> items)
69 {
71 for (int x : items)
72 l.append(x);
73 return l;
74 }
75};
76
77class DynDlistSortTest : public ::testing::Test
78{
79protected:
81
82 void SetUp() override
83 {
84 for (int x : {5, 2, 8, 1, 9, 3, 7, 4, 6, 0})
85 list.append(x);
86 }
87
88 DynDlist<int> build_list(std::initializer_list<int> items)
89 {
91 for (int x : items)
92 l.append(x);
93 return l;
94 }
95};
96
97class DynArraySortTest : public ::testing::Test
98{
99protected:
101
102 void SetUp() override
103 {
104 arr.reserve(10);
105 int values[] = {5, 2, 8, 1, 9, 3, 7, 4, 6, 0};
106 for (size_t i = 0; i < 10; ++i)
107 arr(i) = values[i];
108 }
109
110 DynArray<int> build_array(std::initializer_list<int> items)
111 {
113 a.reserve(items.size());
114 size_t i = 0;
115 for (int x : items)
116 a(i++) = x;
117 return a;
118 }
119};
120
121class ArraySortTest : public ::testing::Test
122{
123protected:
125
126 void SetUp() override
127 {
128 int values[] = {5, 2, 8, 1, 9, 3, 7, 4, 6, 0};
129 for (int v : values)
130 arr.append(v);
131 }
132
133 Array<int> build_array(std::initializer_list<int> items)
134 {
135 Array<int> a;
136 for (int x : items)
137 a.append(x);
138 return a;
139 }
140};
141
142// ============================================================================
143// DynList sort() tests
144// ============================================================================
145
147{
148 auto sorted = sort(list);
149
150 // Original unchanged
151 EXPECT_EQ(list.get_first(), 5);
152
153 // Result is sorted
154 int prev = -1;
155 sorted.for_each([&prev](int x) {
156 EXPECT_GT(x, prev);
157 prev = x;
158 });
159}
160
162{
163 auto sorted = sort(list, std::greater<int>());
164
165 // Descending order
166 int prev = 100;
167 sorted.for_each([&prev](int x) {
168 EXPECT_LT(x, prev);
169 prev = x;
170 });
171}
172
174{
175 DynList<int> temp = build_list({3, 1, 2});
176 auto sorted = sort(std::move(temp));
177
178 // Original moved from
179 EXPECT_TRUE(temp.is_empty());
180
181 // Result is sorted
182 EXPECT_EQ(sorted.get_first(), 1);
183 EXPECT_EQ(sorted.get_last(), 3);
184}
185
187{
188 in_place_sort(list);
189
190 // Original is now sorted
191 int prev = -1;
192 list.for_each([&prev](int x) {
193 EXPECT_GT(x, prev);
194 prev = x;
195 });
196}
197
203
205{
206 DynList<int> empty;
207 auto sorted = sort(empty);
208 EXPECT_TRUE(sorted.is_empty());
209}
210
212{
214 single.append(42);
215 auto sorted = sort(single);
216 EXPECT_EQ(sorted.size(), 1u);
217 EXPECT_EQ(sorted.get_first(), 42);
218}
219
221{
222 DynList<int> already = build_list({1, 2, 3, 4, 5});
223 auto sorted = sort(already);
225}
226
228{
229 DynList<int> reversed = build_list({5, 4, 3, 2, 1});
230 auto sorted = sort(reversed);
232 EXPECT_EQ(sorted.get_first(), 1);
233}
234
236{
237 DynList<int> dups = build_list({3, 1, 3, 1, 2, 2});
238 auto sorted = sort(dups);
240}
241
242// ============================================================================
243// DynDlist sort() tests
244// ============================================================================
245
247{
248 auto sorted = sort(list);
250 EXPECT_EQ(list.get_first(), 5); // Original unchanged
251}
252
254{
255 auto sorted = sort(list, std::greater<int>());
256
257 int prev = 100;
258 sorted.for_each([&prev](int x) {
259 EXPECT_LT(x, prev);
260 prev = x;
261 });
262}
263
265{
266 DynDlist<int> temp = build_list({3, 1, 2});
267 auto sorted = sort(std::move(temp));
268 EXPECT_TRUE(temp.is_empty());
270}
271
277
278// ============================================================================
279// DynArray sort() tests
280// ============================================================================
281
283{
284 auto sorted = sort(arr);
285
286 // Original unchanged
287 EXPECT_EQ(arr(0), 5);
288
289 // Result is sorted
290 for (size_t i = 1; i < sorted.size(); ++i)
291 EXPECT_LE(sorted(i-1), sorted(i));
292}
293
295{
296 auto sorted = sort(arr, std::greater<int>());
297
298 for (size_t i = 1; i < sorted.size(); ++i)
299 EXPECT_GE(sorted(i-1), sorted(i));
300}
301
303{
304 DynArray<int> temp = build_array({3, 1, 2});
305 auto sorted = sort(std::move(temp));
306
307 // Original should be empty after move
308 EXPECT_EQ(temp.size(), 0u);
309
310 // Result is sorted
311 EXPECT_EQ(sorted(0), 1);
312 EXPECT_EQ(sorted(1), 2);
313 EXPECT_EQ(sorted(2), 3);
314}
315
317{
318 in_place_sort(arr);
319
320 for (size_t i = 1; i < arr.size(); ++i)
321 EXPECT_LE(arr(i-1), arr(i));
322}
323
329
331{
332 DynArray<int> empty;
333 auto sorted = sort(empty);
334 EXPECT_EQ(sorted.size(), 0u);
335}
336
338{
340 single.reserve(1);
341 single.touch(0) = 42;
342 auto sorted = sort(single);
343 EXPECT_EQ(sorted.size(), 1u);
344 EXPECT_EQ(sorted(0), 42);
345}
346
347// ============================================================================
348// Array sort() tests
349// ============================================================================
350
352{
353 auto sorted = sort(arr);
354 EXPECT_EQ(arr(0), 5); // Original unchanged
355
356 for (size_t i = 1; i < sorted.size(); ++i)
357 EXPECT_LE(sorted(i-1), sorted(i));
358}
359
361{
362 Array<int> temp = build_array({3, 1, 2});
363 auto sorted = sort(std::move(temp));
364 EXPECT_EQ(sorted(0), 1);
365 EXPECT_EQ(sorted(2), 3);
366}
367
369{
370 in_place_sort(arr);
371 for (size_t i = 1; i < arr.size(); ++i)
372 EXPECT_LE(arr(i-1), arr(i));
373}
374
375// ============================================================================
376// stdsort() tests
377// ============================================================================
378
380{
381 std::vector<int> v = {5, 2, 8, 1, 9};
382 auto sorted = stdsort(v);
383
384 EXPECT_EQ(v[0], 5); // Original unchanged
385 EXPECT_EQ(sorted, (std::vector<int>{1, 2, 5, 8, 9}));
386}
387
389{
390 std::vector<int> v = {5, 2, 8, 1, 9};
391 auto sorted = stdsort(v, std::greater<int>());
392 EXPECT_EQ(sorted, (std::vector<int>{9, 8, 5, 2, 1}));
393}
394
396{
397 std::deque<int> d = {5, 2, 8, 1, 9};
398 auto sorted = stdsort(d);
399 EXPECT_EQ(sorted, (std::deque<int>{1, 2, 5, 8, 9}));
400}
401
403{
404 std::vector<int> empty;
405 auto sorted = stdsort(empty);
406 EXPECT_TRUE(sorted.empty());
407}
408
409// ============================================================================
410// ranks() tests
411// ============================================================================
412
414{
415 DynArray<int> arr;
416 arr.reserve(3);
417 arr(0) = 30; // rank 2
418 arr(1) = 10; // rank 0
419 arr(2) = 20; // rank 1
420
421 auto r = ranks(arr);
422
423 EXPECT_EQ(r(0), 2u); // 30 is largest -> rank 2
424 EXPECT_EQ(r(1), 0u); // 10 is smallest -> rank 0
425 EXPECT_EQ(r(2), 1u); // 20 is middle -> rank 1
426}
427
429{
430 Array<int> arr;
431 arr.append(30);
432 arr.append(10);
433 arr.append(20);
434
435 auto r = ranks(arr);
436
437 EXPECT_EQ(r(0), 2u);
438 EXPECT_EQ(r(1), 0u);
439 EXPECT_EQ(r(2), 1u);
440}
441
443{
444 DynList<int> list;
445 list.append(30);
446 list.append(10);
447 list.append(20);
448
449 auto r = ranks(list);
450
451 EXPECT_EQ(r(0), 2u);
452 EXPECT_EQ(r(1), 0u);
453 EXPECT_EQ(r(2), 1u);
454}
455
457{
458 DynDlist<int> list;
459 list.append(30);
460 list.append(10);
461 list.append(20);
462
463 auto r = ranks(list);
464
465 EXPECT_EQ(r(0), 2u);
466 EXPECT_EQ(r(1), 0u);
467 EXPECT_EQ(r(2), 1u);
468}
469
471{
472 DynArray<int> empty;
473 auto r = ranks(empty);
474 EXPECT_EQ(r.size(), 0u);
475}
476
478{
480 single.reserve(1);
481 single.touch(0) = 42;
482 auto r = ranks(single);
483 EXPECT_EQ(r.size(), 1u);
484 EXPECT_EQ(r(0), 0u);
485}
486
488{
489 DynArray<int> arr;
490 arr.reserve(5);
491 for (size_t i = 0; i < 5; ++i)
492 arr(i) = static_cast<int>(i);
493
494 auto r = ranks(arr);
495
496 for (size_t i = 0; i < 5; ++i)
497 EXPECT_EQ(r(i), i);
498}
499
501{
502 DynArray<int> arr;
503 arr.reserve(5);
504 for (size_t i = 0; i < 5; ++i)
505 arr(i) = static_cast<int>(4 - i);
506
507 auto r = ranks(arr);
508
509 for (size_t i = 0; i < 5; ++i)
510 EXPECT_EQ(r(i), 4 - i);
511}
512
514{
515 DynArray<int> arr;
516 arr.reserve(6);
517 arr(0) = 5;
518 arr(1) = 1;
519 arr(2) = 5;
520 arr(3) = 2;
521 arr(4) = 2;
522 arr(5) = 1;
523
524 auto r = ranks(arr);
525 ASSERT_EQ(r.size(), arr.size());
526
527 // ranks() must be a permutation of 0..n-1
528 std::vector<size_t> seen(r.size(), 0);
529 for (size_t i = 0; i < r.size(); ++i)
530 {
531 ASSERT_LT(r(i), r.size());
532 ++seen[r(i)];
533 }
534 for (size_t k = 0; k < seen.size(); ++k)
535 EXPECT_EQ(seen[k], 1u);
536
537 // Ordering property: if a[i] < a[j] then r[i] < r[j]
538 for (size_t i = 0; i < arr.size(); ++i)
539 for (size_t j = 0; j < arr.size(); ++j)
540 if (arr(i) < arr(j))
541 EXPECT_LT(r(i), r(j));
542}
543
544// ============================================================================
545// pair_ranks() tests
546// ============================================================================
547
549{
550 DynArray<int> arr;
551 arr.reserve(3);
552 arr(0) = 30;
553 arr(1) = 10;
554 arr(2) = 20;
555
556 auto pr = pair_ranks(arr);
557
558 EXPECT_EQ(pr(0).first, 30);
559 EXPECT_EQ(pr(0).second, 2u);
560 EXPECT_EQ(pr(1).first, 10);
561 EXPECT_EQ(pr(1).second, 0u);
562 EXPECT_EQ(pr(2).first, 20);
563 EXPECT_EQ(pr(2).second, 1u);
564}
565
567{
568 Array<int> arr;
569 arr.append(30);
570 arr.append(10);
571 arr.append(20);
572
573 auto pr = pair_ranks(arr);
574
575 EXPECT_EQ(pr(0).first, 30);
576 EXPECT_EQ(pr(0).second, 2u);
577}
578
580{
581 DynList<int> list;
582 list.append(30);
583 list.append(10);
584 list.append(20);
585
586 auto pr = pair_ranks(list);
587
588 EXPECT_EQ(pr(0).first, 30);
589 EXPECT_EQ(pr(0).second, 2u);
590 EXPECT_EQ(pr(1).first, 10);
591 EXPECT_EQ(pr(1).second, 0u);
592}
593
595{
596 DynDlist<int> list;
597 list.append(30);
598 list.append(10);
599 list.append(20);
600
601 auto pr = pair_ranks(list);
602
603 EXPECT_EQ(pr(0).first, 30);
604 EXPECT_EQ(pr(0).second, 2u);
605}
606
607// ============================================================================
608// in_place_multisort_arrays() tests
609// ============================================================================
610
612{
613 std::vector<int> keys = {3, 1, 2};
614 std::vector<std::string> names = {"Charlie", "Alice", "Bob"};
615
616 in_place_multisort_arrays(std::less<int>(), keys, names);
617
618 EXPECT_EQ(keys, (std::vector<int>{1, 2, 3}));
619 EXPECT_EQ(names, (std::vector<std::string>{"Alice", "Bob", "Charlie"}));
620}
621
623{
624 std::vector<int> ids = {3, 1, 2};
625 std::vector<std::string> names = {"Charlie", "Alice", "Bob"};
626 std::vector<int> ages = {30, 25, 28};
627
628 in_place_multisort_arrays(std::less<int>(), ids, names, ages);
629
630 EXPECT_EQ(ids, (std::vector<int>{1, 2, 3}));
631 EXPECT_EQ(names, (std::vector<std::string>{"Alice", "Bob", "Charlie"}));
632 EXPECT_EQ(ages, (std::vector<int>{25, 28, 30}));
633}
634
636{
637 std::vector<int> keys = {1, 2, 3};
638 std::vector<char> values = {'a', 'b', 'c'};
639
640 in_place_multisort_arrays(std::greater<int>(), keys, values);
641
642 EXPECT_EQ(keys, (std::vector<int>{3, 2, 1}));
643 EXPECT_EQ(values, (std::vector<char>{'c', 'b', 'a'}));
644}
645
647{
648 std::vector<int> keys;
649 std::vector<int> values;
650
651 // Should not throw
652 in_place_multisort_arrays(std::less<int>(), keys, values);
653
654 EXPECT_TRUE(keys.empty());
655 EXPECT_TRUE(values.empty());
656}
657
659{
660 std::vector<int> keys = {42};
661 std::vector<std::string> values = {"answer"};
662
663 in_place_multisort_arrays(std::less<int>(), keys, values);
664
665 EXPECT_EQ(keys, (std::vector<int>{42}));
666 EXPECT_EQ(values, (std::vector<std::string>{"answer"}));
667}
668
670{
671 std::vector<int> keys = {2, 1, 2, 1, 2};
672 std::vector<char> aux = {'a', 'b', 'c', 'd', 'e'};
673
674 in_place_multisort_arrays(std::less<int>(), keys, aux);
675
676 EXPECT_EQ(keys, (std::vector<int>{1, 1, 2, 2, 2}));
677 // Stable: elements with equal keys preserve relative order
678 EXPECT_EQ(aux, (std::vector<char>{'b', 'd', 'a', 'c', 'e'}));
679}
680
682{
683 std::vector<int> keys = {1, 2, 3, 4, 5};
684 std::vector<int> values = {10, 20, 30, 40, 50};
685
686 in_place_multisort_arrays(std::less<int>(), keys, values);
687
688 EXPECT_EQ(keys, (std::vector<int>{1, 2, 3, 4, 5}));
689 EXPECT_EQ(values, (std::vector<int>{10, 20, 30, 40, 50}));
690}
691
693{
694 std::mt19937 rng(123456u);
695 std::uniform_int_distribution<int> key_dist(0, 5);
696
697 for (size_t trial = 0; trial < 50; ++trial)
698 {
699 const size_t n = 100;
700 std::vector<int> keys(n);
701 std::vector<size_t> pos(n);
702 for (size_t i = 0; i < n; ++i)
703 {
704 keys[i] = key_dist(rng);
705 pos[i] = i;
706 }
707
708 in_place_multisort_arrays(std::less<int>(), true, keys, pos);
709
710 for (size_t i = 1; i < n; ++i)
711 {
712 ASSERT_LE(keys[i - 1], keys[i]);
713 if (keys[i - 1] == keys[i])
714 ASSERT_LT(pos[i - 1], pos[i]);
715 }
716 }
717}
718
720{
721 std::mt19937 rng(78910u);
722 std::uniform_int_distribution<int> key_dist(0, 5);
723
724 const size_t n = 200;
725 std::vector<int> keys(n);
726 std::vector<size_t> pos(n);
727 for (size_t i = 0; i < n; ++i)
728 {
729 keys[i] = key_dist(rng);
730 pos[i] = i;
731 }
732
733 in_place_multisort_arrays(std::less<int>(), false, keys, pos);
734
735 for (size_t i = 1; i < n; ++i)
736 ASSERT_LE(keys[i - 1], keys[i]);
737
738 std::vector<size_t> seen(n, 0);
739 for (auto p : pos)
740 {
741 ASSERT_LT(p, n);
742 ++seen[p];
743 }
744 for (size_t k = 0; k < n; ++k)
745 ASSERT_EQ(seen[k], 1u);
746}
747
749{
750 std::vector<int> keys = {5, 4, 3, 2, 1};
751 std::vector<int> values = {50, 40, 30, 20, 10};
752
753 in_place_multisort_arrays(std::less<int>(), keys, values);
754
755 EXPECT_EQ(keys, (std::vector<int>{1, 2, 3, 4, 5}));
756 EXPECT_EQ(values, (std::vector<int>{10, 20, 30, 40, 50}));
757}
758
760{
761 std::vector<int> keys = {1, 2};
762 std::vector<int> values = {10};
763
764 EXPECT_THROW(in_place_multisort_arrays(std::less<int>(), keys, values),
765 std::invalid_argument);
766}
767
769{
771 keys.append(3); keys.append(1); keys.append(2);
772
773 Array<std::string> values;
774 values.append("c"); values.append("a"); values.append("b");
775
776 in_place_multisort_arrays(std::less<int>(), keys, values);
777
778 EXPECT_EQ(keys(0), 1);
779 EXPECT_EQ(keys(1), 2);
780 EXPECT_EQ(keys(2), 3);
781 EXPECT_EQ(values(0), "a");
782 EXPECT_EQ(values(1), "b");
783 EXPECT_EQ(values(2), "c");
784}
785
787{
788 std::vector<int> keys = {2, 1, 2, 1, 2};
789 std::vector<char> aux = {'a', 'b', 'c', 'd', 'e'};
790
791 in_place_multisort_arrays(std::less<int>(), true, keys, aux);
792
793 EXPECT_EQ(keys, (std::vector<int>{1, 1, 2, 2, 2}));
794 EXPECT_EQ(aux, (std::vector<char>{'b', 'd', 'a', 'c', 'e'}));
795}
796
798{
799 std::vector<int> keys = {2, 1, 2, 1, 2};
800 std::vector<char> aux = {'a', 'b', 'c', 'd', 'e'};
801
802 in_place_multisort_arrays(std::less<int>(), false, keys, aux);
803
804 EXPECT_EQ(keys, (std::vector<int>{1, 1, 2, 2, 2}));
805 // Result order may differ from stable sort; only keys are guaranteed
806 EXPECT_EQ(keys.size(), aux.size());
807}
808
810{
811 std::vector<std::string> keys = {"banana", "apple", "banana", "apple"};
812 std::vector<int> values = {2, 1, 3, 4};
813
814 in_place_multisort_arrays(std::greater<std::string>(), false, keys, values);
815
816 EXPECT_EQ(keys, (std::vector<std::string>{"banana", "banana", "apple", "apple"}));
817 EXPECT_EQ(values.size(), 4);
818}
819
820// ============================================================================
821// Type traits and compile-time checks
822// ============================================================================
823
825{
826 // The [[nodiscard]] attribute is tested implicitly:
827 // If we call sort() without using the result, the compiler would warn.
828 // This test just verifies the functions compile correctly.
829 DynList<int> list;
830 list.append(1);
831 [[maybe_unused]] auto s1 = sort(list);
832 [[maybe_unused]] auto s2 = sort(std::move(list));
833}
834
836{
837 DynArray<int> arr;
838 arr.reserve(1);
839 arr.touch(0) = 1;
840 [[maybe_unused]] auto r = ranks(arr);
841}
842
844{
845 DynArray<int> arr;
846 arr.reserve(1);
847 arr.touch(0) = 1;
848 [[maybe_unused]] auto pr = pair_ranks(arr);
849}
850
851// ============================================================================
852// Edge cases and stress tests
853// ============================================================================
854
856{
857 DynList<int> list;
858 for (int i = 999; i >= 0; --i)
859 list.append(i);
860
861 auto sorted = sort(list);
863 EXPECT_EQ(sorted.get_first(), 0);
864 EXPECT_EQ(sorted.get_last(), 999);
865}
866
868{
869 DynArray<int> arr;
870 arr.reserve(1000);
871 for (size_t i = 0; i < 1000; ++i)
872 arr(i) = static_cast<int>(999 - i);
873
874 in_place_sort(arr);
875
876 for (size_t i = 1; i < arr.size(); ++i)
877 EXPECT_LE(arr(i-1), arr(i));
878}
879
881{
882 DynList<int> list;
883 for (int i = 0; i < 100; ++i)
884 list.append(42);
885
886 auto sorted = sort(list);
888
889 sorted.for_each([](int x) {
890 EXPECT_EQ(x, 42);
891 });
892}
893
895{
897 list.append("banana");
898 list.append("apple");
899 list.append("cherry");
900
901 auto sorted = sort(list);
902
903 EXPECT_EQ(sorted.get_first(), "apple");
904 EXPECT_EQ(sorted.get_last(), "cherry");
905}
906
908{
909 DynArray<int> arr;
910 arr.reserve(5);
911 arr(0) = 1; arr(1) = 2; arr(2) = 3; arr(3) = 4; arr(4) = 5;
912
913 // Sort by absolute difference from 3
914 auto sorted = sort(arr, [](int a, int b) {
915 return std::abs(a - 3) < std::abs(b - 3);
916 });
917
918 EXPECT_EQ(sorted(0), 3); // difference 0
919}
High-level sorting functions for Aleph containers.
TEST_F(DynListSortTest, SortReturnsSortedCopy)
Simple dynamic array with automatic resizing and functional operations.
Definition tpl_array.H:139
T & append(const T &data)
Append a copy of data
Definition tpl_array.H:245
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.
Dynamic singly linked list with functional programming support.
Definition htlist.H:1155
T & append(const T &item)
Definition htlist.H:1271
void SetUp() override
Array< int > arr
Array< int > build_array(std::initializer_list< int > items)
DynArray< int > arr
void SetUp() override
DynArray< int > build_array(std::initializer_list< int > items)
DynDlist< int > list
void SetUp() override
DynDlist< int > build_list(std::initializer_list< int > items)
DynList< int > list
void SetUp() override
DynList< int > build_list(std::initializer_list< int > items)
#define TEST(name)
static mt19937 rng
Main namespace for Aleph-w library functions.
Definition ah-arena.H:89
bool is_sorted(const Container< T > &cont, const Compare &cmp=Compare())
Check if a container is sorted in ascending order.
auto pair_ranks(const Array< T > &c)
Computes (value, rank) pairs for each element in an Array.
Definition ahSort.H:587
Divide_Conquer_DP_Result< Cost > divide_and_conquer_partition_dp(const size_t groups, const size_t n, Transition_Cost_Fn transition_cost, const Cost inf=dp_optimization_detail::default_inf< Cost >())
Optimize partition DP using divide-and-conquer optimization.
DynArray< T > sort(const DynArray< T > &a, Cmp &&cmp=Cmp())
Returns a sorted copy of a DynArray.
Definition ahSort.H:227
DynArray< T > & in_place_sort(DynArray< T > &c, Cmp cmp=Cmp())
Sorts a DynArray in place.
Definition ahSort.H:321
Array< T > build_array(Args ... args)
Definition tpl_array.H:481
Array< size_t > ranks(const Array< T > &array)
Computes the rank of each element in an Array.
Definition ahSort.H:524
Container stdsort(const Container &c, Cmp cmp=Cmp())
Sorts an STL-compatible container using std::sort.
Definition ahSort.H:300
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.
Definition ahSort.H:670
STL namespace.
int keys[]
static int * k
gsl_rng * r
Lazy and scalable dynamic array implementation.
Dynamic doubly linked list implementation.
Alias for htlist.H (DynList implementation).
DynList< int > l