52 static constexpr
int kRadixBits = 8;
53 static constexpr
size_t kInsertSortThreshold = 64;
54 static constexpr
int kRadixMask = (1 << kRadixBits) - 1;
55 static constexpr
int kRadixBin = 1 << kRadixBits;
60 struct RadixTraitsUnsigned
62 static constexpr
int nBytes =
sizeof(T);
63 int kth_byte(
const T& x,
int k) {
return (x >> (kRadixBits * k)) & kRadixMask; }
64 bool compare(
const T& x,
const T& y) {
return x < y; }
68 struct RadixTraitsSigned
70 static constexpr
int nBytes =
sizeof(T);
71 static const T kMSB = T(0x80) << ((
sizeof(T) - 1) * 8);
72 int kth_byte(
const T& x,
int k) {
return ((x ^ kMSB) >> (kRadixBits * k)) & kRadixMask; }
73 bool compare(
const T& x,
const T& y) {
return x < y; }
76 template <
class RandomIt,
class ValueType,
class RadixTraits>
77 inline void insert_sort_core_(RandomIt s, RandomIt e, RadixTraits radix_traits)
79 for (RandomIt i = s + 1; i < e; ++i)
81 if (radix_traits.compare(*i, *(i - 1)))
86 for (j = i - 1; j > s && radix_traits.compare(tmp, *(j - 1)); --j)
95 template <
class RandomIt,
class ValueType,
class RadixTraits,
int kWhichByte>
96 inline void radix_sort_core_(RandomIt s, RandomIt e, RadixTraits radix_traits)
98 RandomIt last_[kRadixBin + 1];
99 RandomIt* last = last_ + 1;
100 size_t count[kRadixBin] = { 0 };
102 for (RandomIt i = s; i < e; ++i)
104 ++count[radix_traits.kth_byte(*i, kWhichByte)];
107 last_[0] = last_[1] = s;
109 for (
int i = 1; i < kRadixBin; ++i)
111 last[i] = last[i - 1] + count[i - 1];
114 for (
int i = 0; i < kRadixBin; ++i)
116 RandomIt end = last[i - 1] + count[i];
122 while (last[i] != end)
124 ValueType swapper = *last[i];
125 int tag = radix_traits.kth_byte(swapper, kWhichByte);
130 std::swap(swapper, *last[tag]++);
131 }
while ((tag = radix_traits.kth_byte(swapper, kWhichByte)) != i);
140 for (
int i = 0; i < kRadixBin; ++i)
142 if (count[i] > kInsertSortThreshold)
144 radix_sort_core_<RandomIt, ValueType, RadixTraits, (kWhichByte > 0 ? (kWhichByte - 1) : 0)>(
145 last[i - 1], last[i], radix_traits);
147 else if (count[i] > 1)
149 insert_sort_core_<RandomIt, ValueType, RadixTraits>(last[i - 1], last[i], radix_traits);
155 template <
class RandomIt,
class ValueType,
class RadixTraits>
156 inline void radix_sort_entry_(RandomIt s, RandomIt e, ValueType*, RadixTraits radix_traits)
158 if (e - s <= (
int)kInsertSortThreshold)
159 insert_sort_core_<RandomIt, ValueType, RadixTraits>(s, e, radix_traits);
161 radix_sort_core_<RandomIt, ValueType, RadixTraits, RadixTraits::nBytes - 1>(s, e, radix_traits);
164 template <
class RandomIt,
class ValueType>
165 inline void radix_sort_entry_(RandomIt s, RandomIt e, ValueType*)
167 if (ValueType(-1) > ValueType(0))
169 radix_sort_entry_(s, e, (ValueType*)(0), RadixTraitsUnsigned<ValueType>());
173 radix_sort_entry_(s, e, (ValueType*)(0), RadixTraitsSigned<ValueType>());
179 template <
class RandomIt,
class RadixTraits>
180 inline void radix_sort(RandomIt s, RandomIt e, RadixTraits radix_traits)
182 typename std::iterator_traits<RandomIt>::value_type* dummy(0);
183 radix_sort_entry_(s, e, dummy, radix_traits);
186 template <
class RandomIt>
187 inline void radix_sort(RandomIt s, RandomIt e)
189 typename std::iterator_traits<RandomIt>::value_type* dummy(0);
190 radix_sort_entry_(s, e, dummy);