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>
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);
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;
92 eBits<E,F>(rbits,bitOffset,f));
95 eBits<E,F>(rbits,bitOffset,f));
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);
void integerSort(std::pair< uint32_t, T > *A, int n)
void radixStep(E *A, E *B, bIndexT *Tmp, int *counts, int n, int m, F extract)
void iSort(E *A, int n, int m, F f)
eBits(int bits, int offset, F f)