CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
BitonicSort.h
Go to the documentation of this file.
1 #ifndef BitonicSort_h
2 #define BitonicSort_h
3 
4 #include <cstdint>
5 #include <vector>
6 
7 
9 
10 // DECLARE!
11 template <typename T>
12 void BitonicSort( sort_direction aDir,
13  typename std::vector<T>::iterator & aDataStart,
14  typename std::vector<T>::iterator & aDataEnd
15  );
16 template <typename T>
17 void BitonicMerge( sort_direction aDir,
18  typename std::vector<T>::iterator & aDataStart,
19  typename std::vector<T>::iterator & aDataEnd
20  );
21 //DEFINE!
22 
23 
24 //SORT
25 template <typename T>
27  typename std::vector<T>::iterator & aDataStart,
28  typename std::vector<T>::iterator & aDataEnd
29  )
30 {
31  uint32_t lSize( aDataEnd - aDataStart );
32  if( lSize > 1 ){
33  typename std::vector<T>::iterator lMidpoint( aDataStart+(lSize>>1) );
34  if ( aDir == down )
35  {
36  BitonicSort<T> ( up, aDataStart , lMidpoint );
37  BitonicSort<T> ( down, lMidpoint , aDataEnd );
38  }else{
39  BitonicSort<T> ( down, aDataStart , lMidpoint );
40  BitonicSort<T> ( up, lMidpoint , aDataEnd );
41  }
42  BitonicMerge<T> (aDir, aDataStart , aDataEnd );
43  }
44 }
45 
46 //MERGE
47 template <typename T>
49  typename std::vector<T>::iterator & aDataStart,
50  typename std::vector<T>::iterator & aDataEnd
51  )
52 {
53  uint32_t lSize( aDataEnd - aDataStart );
54  if( lSize > 1 ){
55 
56  uint32_t lPower2(1);
57  while (lPower2<lSize) lPower2<<=1;
58 
59  typename std::vector<T>::iterator lMidpoint( aDataStart + (lPower2>>1) );
60  typename std::vector<T>::iterator lFirst( aDataStart );
61  typename std::vector<T>::iterator lSecond( lMidpoint );
62 
63  for( ; lSecond != aDataEnd ; ++lFirst , ++lSecond ){
64  if( ( (*lFirst) > (*lSecond) ) == (aDir == up) ) {
65  std::swap( *lFirst , *lSecond );
66  }
67  }
68 
69  BitonicMerge<T> ( aDir, aDataStart , lMidpoint );
70  BitonicMerge<T> ( aDir, lMidpoint , aDataEnd );
71  }
72 }
73 
74 #endif
Definition: BitonicSort.h:8
sort_direction
Definition: BitonicSort.h:8
void swap(edm::DataFrameContainer &lhs, edm::DataFrameContainer &rhs)
void BitonicSort(sort_direction aDir, typename std::vector< T >::iterator &aDataStart, typename std::vector< T >::iterator &aDataEnd)
Definition: BitonicSort.h:26
void BitonicMerge(sort_direction aDir, typename std::vector< T >::iterator &aDataStart, typename std::vector< T >::iterator &aDataEnd)
Definition: BitonicSort.h:48