Advertisement
Guest User

quicksort

a guest
Dec 8th, 2023
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.44 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <omp.h>
  3. #include <vector>
  4. #include <cstdlib>
  5. #include <iostream>
  6. #include <algorithm>
  7. #include <time.h>
  8. #include <chrono>
  9.  
  10. using namespace std;
  11. using namespace std::chrono;
  12.  
  13. #define VEC_SIZE 10000
  14. #define GENERATOR_RANGE 50
  15.  
  16. int partition(vector<int> &data, int p, int r){
  17. int pivot = data[p];
  18. int left = p;
  19. int right = r;
  20. while (left < right){
  21. while (left < r && data[left] <= pivot) ++left;
  22. while (right >= 0 && data[right] > pivot) --right;
  23. if (left < right && left <r && right >= 0)
  24. {
  25. std::swap(data[left], data[right]);
  26. }
  27. }
  28.  
  29. if (left < right && left <r && right >= 0)
  30. {
  31. std::swap(data[left], data[right]);
  32. }
  33. data[p] = data[right];
  34. data[right] = pivot;
  35. return right;
  36. }
  37.  
  38. void ParallelQuickSort (vector<int> &dataList, int nLower, int nUpper)
  39. {
  40. if (nLower < nUpper)
  41. {
  42. int nSplit = partition (dataList, nLower, nUpper);
  43. omp_set_num_threads(2);
  44. #pragma omp parallel sections
  45. {
  46. #pragma omp section
  47. ParallelQuickSort (dataList, nLower, nSplit - 1);
  48.  
  49. #pragma omp section
  50. ParallelQuickSort (dataList, nSplit + 1, nUpper);
  51. }
  52. }
  53. }
  54.  
  55. void SerialQuickSort(vector<int> &dataList, int nLower, int nUpper)
  56. {
  57. if (nLower < nUpper)
  58. {
  59. int nSplit = partition (dataList, nLower, nUpper);
  60. SerialQuickSort (dataList, nLower, nSplit - 1);
  61. SerialQuickSort (dataList, nSplit + 1, nUpper);
  62. }
  63. }
  64.  
  65. void random_num_generator(vector<int> &vec)
  66. {
  67. for(int i=0;i<VEC_SIZE;i++)
  68. {
  69. vec.push_back(rand()%GENERATOR_RANGE);
  70. }
  71. }
  72.  
  73.  
  74. void start_parallel_quicksort(vector<int> &vec,double &parallel_run_time)
  75. {
  76. double parallel_start_time;
  77. parallel_start_time=omp_get_wtime();
  78. #pragma omp parallel
  79. {
  80. #pragma omp single nowait
  81. ParallelQuickSort(vec,0,VEC_SIZE-1);
  82. }
  83. parallel_run_time=omp_get_wtime()-parallel_start_time;
  84. }
  85.  
  86. void start_serial_quicksort(vector<int> &vec, duration<double> &serial_run_time)
  87. {
  88. auto serial_start_time = high_resolution_clock::now();
  89. SerialQuickSort(vec,0,VEC_SIZE-1);
  90. auto serial_end_time=high_resolution_clock::now();
  91. serial_run_time=serial_end_time-serial_start_time;
  92. }
  93.  
  94. void sort_verifier(vector<int> &vec)
  95. {
  96. if(is_sorted(vec.begin(),vec.end()))
  97. {
  98. cout<<"sorted successfully"<<endl;
  99. }
  100. else
  101. {
  102. cout<<"sort failed"<<endl;
  103. }
  104. }
  105.  
  106.  
  107. int main()
  108. {
  109. srand(time(NULL));
  110. double parallel_run_time;
  111. duration<double>serial_run_time;
  112. vector<int>vec,vec_duplicate;//duplicate=> for serial quicksort to run on and calculate time for comparison
  113. random_num_generator(vec);
  114. vec_duplicate=vec;
  115.  
  116. start_parallel_quicksort(vec,parallel_run_time);
  117. sort_verifier(vec);
  118.  
  119. start_serial_quicksort(vec_duplicate,serial_run_time);
  120. sort_verifier(vec_duplicate);
  121. cout<<"parallel time:"<<parallel_run_time<<" serial time:"<<serial_run_time.count()<<endl;
  122.  
  123. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement