23 #ifndef _S_RADIX_INCLUDED 24 #define _S_RADIX_INCLUDED 38 #define BUCKETS (1 << MAX_RADIX) 44 template <
class E,
class F>
46 int n,
int m, F extract) {
47 for (
int i = 0; i < m; i++) counts[i] = 0;
48 for (
int j = 0; j < n; j++) {
49 int k = Tmp[j] = extract(A[j]);
53 for (
int i = 0; i < m; i++) {
57 for (
int j = n-1; j >= 0; j--) {
58 int x = --counts[Tmp[j]];
64 template <
class E,
class F>
68 eBits(
int bits,
int offset, F f): _f(f), _mask((1<<bits)-1),
74 template <
class E,
class F>
75 void iSort(E *
A,
int n,
int m, F f) {
76 int bits = utils::log2Up(m);
79 E*
B = (E*) malloc(
sizeof(E)*n);
80 bIndexT* Tmp = (bIndexT*) malloc(
sizeof(bIndexT)*n);
81 int* counts = (
int*) malloc(
sizeof(
int)*
BUCKETS);
84 int rbits = 1+(bits-1)/rounds;
88 while (bitOffset < bits) {
89 if (bitOffset+rbits > bits) rbits = bits-bitOffset;
91 radixStep(B, A, Tmp, counts, n, 1 << rbits,
94 radixStep(A, B, Tmp, counts, n, 1 << rbits,
101 for (
int i=0; i < n; i++)
104 free(B); free(Tmp); free(counts);
111 for (
int i=0; i<n; i++) maxV = std::max(maxV,
A[i]);
118 for (
int i=0; i<n; i++) maxV = std::max(maxV,A[i].first);
122 #endif // _S_RADIX_INCLUDED
void iSort(E *A, int n, int m, F f)
eBits(int bits, int offset, F f)
void radixStep(E *A, E *B, bIndexT *Tmp, int *counts, int n, int m, F extract)
void integerSort(std::pair< uint32_t, T > *A, int n)