alglib::mutithreaded Namespace Reference

Functions

template<typename RandomAccessIter >
void merge_sort (RandomAccessIter first, RandomAccessIter last)
 

Function Documentation

template<typename RandomAccessIter >
void alglib::mutithreaded::merge_sort ( RandomAccessIter  first,
RandomAccessIter  last 
)
13  {
14 
15  const int min_size = 1000000;
16 
17  int sz = last - first;
18  if(sz > 1) {
19 
20  // Left subarray - spawn a thread for it
21  std::vector<typename RandomAccessIter::value_type> subarr1(first, first + sz / 2);
22 
23  std::thread left;
24 
25  if(subarr1.size() > min_size)
26  left = std::thread(merge_sort<RandomAccessIter>, subarr1.begin(), subarr1.end());
27  else
28  merge_sort(subarr1.begin(), subarr1.end());
29 
30  // Right subarray
31  std::vector<typename RandomAccessIter::value_type> subarr2(first + sz / 2, last);
32  merge_sort(subarr2.begin(), subarr2.end());
33 
34  if(left.joinable())
35  left.join();
36 
37  std::merge(subarr1.begin(), subarr1.end(), subarr2.begin(), subarr2.end(), first);
38  }
39 }
void merge_sort(RandomAccessIter first, RandomAccessIter last)
Definition: parallel_sort.h:13