parallel_sort.h
Go to the documentation of this file.
1 
2 #ifndef _PARALLEL_SORT_H
3 #define _PARALLEL_SORT_H
4 
5 #include <algorithm>
6 #include <thread>
7 #include <vector>
8 
9 namespace alglib {
10 namespace mutithreaded {
11 
12 template<typename RandomAccessIter>
13 void merge_sort(RandomAccessIter first, RandomAccessIter last) {
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 }
40 
41 
42 
43 } // end of multithreaded namespace
44 } // end of alglib namespace
45 
46 #endif
Definition: bimap.h:17
void merge_sort(RandomAccessIter first, RandomAccessIter last)
Definition: parallel_sort.h:13