Advertisement
Guest User

Untitled

a guest
Jan 24th, 2020
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.77 KB | None | 0 0
  1. #include <thread>
  2. #include <mutex>
  3. #include <iostream>
  4.  
  5. using namespace std;
  6.  
  7. void merge_sort_recursive_par(int arr[], int reg[], const int start, const int end) {
  8. thread threads[thread::hardware_concurrency()];
  9. if (start >= end)
  10. return;
  11. int len = end - start, mid = (len >> 1) + start;
  12. int start1 = start, end1 = mid;
  13. int start2 = mid + 1, end2 = end;
  14. int iter = thread::hardware_concurrency();
  15. int iter1 = thread::hardware_concurrency();
  16.  
  17. mutex mu;
  18. mu.lock();
  19. for (int i = 0; i < thread::hardware_concurrency(); i++)
  20. {
  21. if (!threads[i].joinable())
  22. {
  23. threads[i] = thread(merge_sort_recursive_par, arr, reg, start1, end1);
  24. iter = i;
  25. break;
  26. };
  27. }
  28.  
  29. for (int j = 0; j < thread::hardware_concurrency(); j++)
  30. {
  31. if (!threads[j].joinable())
  32. {
  33. threads[j] = thread(merge_sort_recursive_par, arr, reg, start2, end2);
  34. iter1 = j;
  35. break;
  36. };
  37.  
  38. }
  39. mu.unlock();
  40.  
  41. if (iter < thread::hardware_concurrency())
  42. {
  43. threads[iter].join();
  44.  
  45. };
  46. if (iter1 < thread::hardware_concurrency())
  47. {
  48. threads[iter1].join();
  49. };
  50.  
  51. if (iter == thread::hardware_concurrency())
  52. {
  53. merge_sort_recursive_par (arr, reg, start1, end1);
  54. }
  55.  
  56. if (iter1 == thread::hardware_concurrency())
  57. {
  58. merge_sort_recursive_par (arr, reg, start2, end2);
  59. }
  60. // merge_sort_recursive (arr, reg, start1, end1);
  61. // merge_sort_recursive (arr, reg, start2, end2);
  62.  
  63. int k = start;
  64. while (start1 <= end1 && start2 <= end2)
  65. reg[k++] = arr[start1] < arr[start2] ? arr[start1++] : arr[start2++];
  66. while (start1 <= end1)
  67. reg[k++] = arr[start1++];
  68. while (start2 <= end2)
  69. reg[k++] = arr[start2++];
  70. for (k = start; k <= end; k++)
  71. arr[k] = reg[k];
  72. }
  73.  
  74. void merge_sort_par(int arr[], const int len) {
  75. int reg[len];
  76. merge_sort_recursive_par(arr, reg, 0, len - 1);
  77. }
  78.  
  79. void merge_sort_recursive_pos(int arr[], int reg[], const int start, const int end) {
  80. if (start >= end)
  81. return;
  82. int len = end - start, mid = (len >> 1) + start;
  83. int start1 = start, end1 = mid;
  84. int start2 = mid + 1, end2 = end;
  85.  
  86. merge_sort_recursive_pos (arr, reg, start1, end1);
  87. merge_sort_recursive_pos (arr, reg, start2, end2);
  88.  
  89. int k = start;
  90. while (start1 <= end1 && start2 <= end2)
  91. reg[k++] = arr[start1] < arr[start2] ? arr[start1++] : arr[start2++];
  92. while (start1 <= end1)
  93. reg[k++] = arr[start1++];
  94. while (start2 <= end2)
  95. reg[k++] = arr[start2++];
  96. for (k = start; k <= end; k++)
  97. arr[k] = reg[k];
  98. }
  99.  
  100. void merge_sort_pos(int arr[], const int len) {
  101. int reg[len];
  102. merge_sort_recursive_pos(arr, reg, 0, len - 1);
  103. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement