1#ifndef _sort_h_INCLUDED
2#define _sort_h_INCLUDED
9#define GREATER_SWAP(TYPE, P, Q, LESS) \
15#define SORTER (solver->sorter)
17#define PARTITION(TYPE, L, R, A, LESS) \
19 const size_t L_PARTITION = (L); \
20 I_QUICK_SORT = L_PARTITION - 1; \
22 size_t J_PARTITION = (R); \
24 TYPE PIVOT_PARTITION = A[J_PARTITION]; \
27 while (LESS (A[++I_QUICK_SORT], PIVOT_PARTITION)) \
29 while (LESS (PIVOT_PARTITION, A[--J_PARTITION])) \
30 if (J_PARTITION == L_PARTITION) \
33 if (I_QUICK_SORT >= J_PARTITION) \
36 SWAP (TYPE, A[I_QUICK_SORT], A[J_PARTITION]); \
39 SWAP (TYPE, A[I_QUICK_SORT], A[R]); \
42#define QUICK_SORT_LIMIT 10
44#define QUICK_SORT(TYPE, N, A, LESS) \
47 KISSAT_assert (EMPTY_STACK (SORTER)); \
49 size_t L_QUICK_SORT = 0; \
50 size_t R_QUICK_SORT = N - 1; \
52 if (R_QUICK_SORT - L_QUICK_SORT <= QUICK_SORT_LIMIT) \
56 const size_t M = L_QUICK_SORT + (R_QUICK_SORT - L_QUICK_SORT) / 2; \
58 SWAP (TYPE, A[M], A[R_QUICK_SORT - 1]); \
60 GREATER_SWAP (TYPE, A[L_QUICK_SORT], A[R_QUICK_SORT - 1], LESS); \
61 GREATER_SWAP (TYPE, A[L_QUICK_SORT], A[R_QUICK_SORT], LESS); \
62 GREATER_SWAP (TYPE, A[R_QUICK_SORT - 1], A[R_QUICK_SORT], LESS); \
64 size_t I_QUICK_SORT; \
66 PARTITION (TYPE, L_QUICK_SORT + 1, R_QUICK_SORT - 1, A, LESS); \
67 KISSAT_assert (L_QUICK_SORT < I_QUICK_SORT); \
68 KISSAT_assert (I_QUICK_SORT <= R_QUICK_SORT); \
70 size_t LL_QUICK_SORT; \
71 size_t RR_QUICK_SORT; \
73 if (I_QUICK_SORT - L_QUICK_SORT < R_QUICK_SORT - I_QUICK_SORT) { \
74 LL_QUICK_SORT = I_QUICK_SORT + 1; \
75 RR_QUICK_SORT = R_QUICK_SORT; \
76 R_QUICK_SORT = I_QUICK_SORT - 1; \
78 LL_QUICK_SORT = L_QUICK_SORT; \
79 RR_QUICK_SORT = I_QUICK_SORT - 1; \
80 L_QUICK_SORT = I_QUICK_SORT + 1; \
82 if (R_QUICK_SORT - L_QUICK_SORT > QUICK_SORT_LIMIT) { \
83 KISSAT_assert (RR_QUICK_SORT - LL_QUICK_SORT > QUICK_SORT_LIMIT); \
84 PUSH_STACK (SORTER, LL_QUICK_SORT); \
85 PUSH_STACK (SORTER, RR_QUICK_SORT); \
86 } else if (RR_QUICK_SORT - LL_QUICK_SORT > QUICK_SORT_LIMIT) { \
87 L_QUICK_SORT = LL_QUICK_SORT; \
88 R_QUICK_SORT = RR_QUICK_SORT; \
89 } else if (!EMPTY_STACK (SORTER)) { \
90 R_QUICK_SORT = POP_STACK (SORTER); \
91 L_QUICK_SORT = POP_STACK (SORTER); \
97#define INSERTION_SORT(TYPE, N, A, LESS) \
99 size_t L_INSERTION_SORT = 0; \
100 size_t R_INSERTION_SORT = N - 1; \
102 for (size_t I_INSERTION_SORT = R_INSERTION_SORT; \
103 I_INSERTION_SORT > L_INSERTION_SORT; I_INSERTION_SORT--) \
104 GREATER_SWAP (TYPE, A[I_INSERTION_SORT - 1], A[I_INSERTION_SORT], \
107 for (size_t I_INSERTION_SORT = L_INSERTION_SORT + 2; \
108 I_INSERTION_SORT <= R_INSERTION_SORT; I_INSERTION_SORT++) { \
109 TYPE PIVOT_INSERTION_SORT = A[I_INSERTION_SORT]; \
111 size_t J_INSERTION_SORT = I_INSERTION_SORT; \
113 while (LESS (PIVOT_INSERTION_SORT, A[J_INSERTION_SORT - 1])) { \
114 A[J_INSERTION_SORT] = A[J_INSERTION_SORT - 1]; \
115 J_INSERTION_SORT--; \
118 A[J_INSERTION_SORT] = PIVOT_INSERTION_SORT; \
123#define CHECK_SORTED(...) \
127#define CHECK_SORTED(N, A, LESS) \
129 for (size_t I_CHECK_SORTED = 0; I_CHECK_SORTED < N - 1; \
131 KISSAT_assert (!LESS (A[I_CHECK_SORTED + 1], A[I_CHECK_SORTED])); \
135#define SORT(TYPE, N, A, LESS) \
137 const size_t N_SORT = (N); \
141 TYPE *A_SORT = (A); \
142 QUICK_SORT (TYPE, N_SORT, A_SORT, LESS); \
143 INSERTION_SORT (TYPE, N_SORT, A_SORT, LESS); \
144 CHECK_SORTED (N_SORT, A_SORT, LESS); \
148#define SORT_STACK(TYPE, S, LESS) \
150 const size_t N_SORT_STACK = SIZE_STACK (S); \
151 if (N_SORT_STACK <= 1) \
153 TYPE *A_SORT_STACK = BEGIN_STACK (S); \
154 SORT (TYPE, N_SORT_STACK, A_SORT_STACK, LESS); \
#define ABC_NAMESPACE_HEADER_END
#define ABC_NAMESPACE_HEADER_START
NAMESPACES ///.