13 #ifndef STXXL_ALGO_INTKSORT_HEADER
14 #define STXXL_ALGO_INTKSORT_HEADER
24 template <
typename TypeKey>
27 typename TypeKey::key_type offset,
unsigned shift)
30 std::fill(bucket, bucket + K, 0);
33 for (TypeKey* p = a; p < aEnd; p++)
60 template <
typename TypeKey>
63 typename TypeKey::key_type offset,
unsigned shift)
65 for (TypeKey* p = a; p < aEnd; p++)
84 sort3(Type& a, Type& b, Type& c)
128 template <
class Type>
130 sort4(Type& a, Type& b, Type& c, Type& d)
180 template <
class Type>
182 sort5(Type& a, Type& b, Type& c, Type& d, Type& e)
226 template <
class Type>
231 for (Type* p = a + 1; p < aEnd; p++)
238 for (pp = p; pp != a; pp--)
247 for (pp = p; t < *(pp - 1); pp--)
259 template <
class Type>
266 Type* cEnd = b + bucket[i];
277 sort3(c[0], c[1], c[2]);
280 sort4(c[0], c[1], c[2], c[3]);
284 sort5(c[0], c[1], c[2], c[3], c[4]);
315 template <
typename TypeKey>
320 typename TypeKey::key_type offset,
int shift)
322 count(a, aEnd, bucket, K, offset, shift);
324 classify(a, aEnd, b, bucket, offset, shift);
328 template <
typename Type,
typename TypeKey,
typename KeyExtractor>
330 int_type* bucket,
typename KeyExtractor::key_type offset,
unsigned shift, KeyExtractor keyobj)
332 assert(shift < (
sizeof(
typename KeyExtractor::key_type) * 8 + 1));
333 for (Type* p = begin; p < end; p++, out++)
336 typename KeyExtractor::key_type key = keyobj(*p);
342 template <
typename Type,
typename TypeKey,
typename KeyExtractor>
343 void classify_block(Type* begin, Type* end, TypeKey*& out,
int_type* bucket,
typename Type::key_type offset,
unsigned shift,
344 const int_type K, KeyExtractor keyobj)
346 assert(shift < (
sizeof(
typename Type::key_type) * 8 + 1));
347 for (Type* p = begin; p < end; p++, out++)
350 typename Type::key_type key = keyobj(*p);
351 int_type ibucket = (key - offset) >> shift;
367 #endif // !STXXL_ALGO_INTKSORT_HEADER
void sort(ExtIterator first, ExtIterator last, StrictWeakOrdering cmp, unsigned_type M)
Sort records comparison-based, see stxxl::sort -- Sorting Comparison-Based.
void sort4(Type &a, Type &b, Type &c, Type &d)
void check_sort_settings()
static void classify(TypeKey *a, TypeKey *aEnd, TypeKey *b, int_type *bucket, typename TypeKey::key_type offset, unsigned shift)
void sort3(Type &a, Type &b, Type &c)
void sort2(Type &a, Type &b)
void classify_block(Type *begin, Type *end, TypeKey *&out, int_type *bucket, typename KeyExtractor::key_type offset, unsigned shift, KeyExtractor keyobj)
choose_int_types< my_pointer_size >::int_type int_type
static void cleanup(Type *b, int_type *bucket, int_type K)
#define STXXL_BEGIN_NAMESPACE
void STXXL_UNUSED(const U &)
void l1sort(TypeKey *a, TypeKey *aEnd, TypeKey *b, int_type *bucket, int_type K, typename TypeKey::key_type offset, int shift)
void insertion_sort(Type *a, Type *aEnd)
static void count(TypeKey *a, TypeKey *aEnd, int_type *bucket, int_type K, typename TypeKey::key_type offset, unsigned shift)
static void exclusive_prefix_sum(int_type *bucket, int_type K)
void sort5(Type &a, Type &b, Type &c, Type &d, Type &e)
#define STXXL_END_NAMESPACE