37#include <boost/sort/spreadsort/spreadsort.hpp>
40#define INSERTION_SORT_CUTOFF 10
48template <
typename T >
52 return ( ( vec[ i ] < vec[ j ] ) ? ( ( vec[ j ] < vec[ k ] ) ? j
53 : ( vec[ i ] < vec[ k ] ) ? k
55 : ( ( vec[ k ] < vec[ j ] ) ? j
56 : ( vec[ k ] < vec[ i ] ) ? k
67template <
typename T1,
typename T2 >
71 for (
size_t i = lo + 1; i < hi + 1; ++i )
73 for (
size_t j = i; j > lo and ( vec_sort[ j ] < vec_sort[ j - 1 ] ); --j )
75 std::swap( vec_sort[ j ], vec_sort[ j - 1 ] );
76 std::swap( vec_perm[ j ], vec_perm[ j - 1 ] );
90template <
typename T1,
typename T2 >
99 const size_t n = hi - lo + 1;
110 vec_sort, lo + std::rand() % ( hi - lo ), lo + std::rand() % ( hi - lo ), lo + std::rand() % ( hi - lo ) );
114 const T1 m_val = vec_sort[ m ];
115 while ( m > 0 and vec_sort[ m - 1 ] == m_val )
121 std::swap( vec_sort[ m ], vec_sort[ lo ] );
122 std::swap( vec_perm[ m ], vec_perm[ lo ] );
128 const T1 v = vec_sort[ lt ];
131 while ( vec_sort[ i ] < v and i < vec_sort.
size() - 1 )
135 std::swap( vec_sort[ lo ], vec_sort[ i - 1 ] );
136 std::swap( vec_perm[ lo ], vec_perm[ i - 1 ] );
140 while ( vec_sort[ gt ] > v and gt > 0 )
147 if ( vec_sort[ i ] < v )
149 std::swap( vec_sort[ lt ], vec_sort[ i ] );
150 std::swap( vec_perm[ lt ], vec_perm[ i ] );
154 else if ( vec_sort[ i ] > v )
156 std::swap( vec_sort[ i ], vec_sort[ gt ] );
157 std::swap( vec_perm[ i ], vec_perm[ gt ] );
175template <
typename T1,
typename T2 >
Container with a vector-of-vectors structure.
Definition block_vector.h:156
iterator begin()
Returns a read/write iterator that points to the first element in the BlockVector.
Definition block_vector.h:380
iterator end()
Returns a read/write iterator that points one past the last element in the BlockVector.
Definition block_vector.h:394
size_t size() const
Returns the number of elements in the BlockVector.
Definition block_vector.h:456
IteratorPair< sort_iter_type_, perm_iter_type_ > make_iterator_pair(sort_iter_type_ sort_iter, perm_iter_type_ perm_iter)
Creates an IteratorPair object, deducing iterator types from the types of arguments.
Definition iterator_pair.h:163
Namespace for the NEST simulation kernel.
Definition beta_normalization_factor.h:33
size_t median3_(const BlockVector< T > &vec, const size_t i, const size_t j, const size_t k)
Calculates the median of three elements.
Definition sort.h:50
void insertion_sort(BlockVector< T1 > &vec_sort, BlockVector< T2 > &vec_perm, const size_t lo, const size_t hi)
Insertion sort, adapted from Sedgewick & Wayne (2011), Algorithms 4th edition, p251ff.
Definition sort.h:69
void sort(BlockVector< T1 > &vec_sort, BlockVector< T2 > &vec_perm)
Sorts two vectors according to elements in first vector.
Definition sort.h:177
void quicksort3way(BlockVector< T1 > &vec_sort, BlockVector< T2 > &vec_perm, const size_t lo, const size_t hi)
Quicksort with 3-way partitioning, adapted from Sedgewick & Wayne (2011), Algorithms 4th edition,...
Definition sort.h:92
#define INSERTION_SORT_CUTOFF
Definition sort.h:40
A rightshift functor for tuples to be used with Boost's sorting function.
Definition iterator_pair.h:173