Advertisement
Guest User

Untitled

a guest
Apr 20th, 2019
115
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.41 KB | None | 0 0
  1. #include <iostream>
  2. #include <array>
  3. #include <chrono>
  4. #include <algorithm>
  5.  
  6. const long int g_arrayElements = 631000;
  7.  
  8. class Timer
  9. {
  10. private:
  11.  
  12. using clock_t = std::chrono::high_resolution_clock;
  13. using second_t = std::chrono::duration<double, std::ratio<1> >;
  14.  
  15. std::chrono::time_point<clock_t> m_beg;
  16.  
  17. public:
  18. Timer() : m_beg(clock_t::now())
  19. {
  20. }
  21.  
  22. void reset()
  23. {
  24. m_beg = clock_t::now();
  25. }
  26.  
  27. double elapsed() const
  28. {
  29. return std::chrono::duration_cast<second_t>(clock_t::now() - m_beg).count();
  30. }
  31. };
  32.  
  33. void InsertionSort(std::array<long int, g_arrayElements> &array)
  34. {
  35. for (long int i = 1; i < g_arrayElements; i++) {
  36. for (long int j = i; j > 0 && array[j - 1] > array[j]; j--) {
  37. long int tmp = array[j];
  38. array[j] = array[j - 1];
  39. array[j - 1] = tmp;
  40. }
  41. }
  42. }
  43. int digit(long int n, long int p) //получение p-го байта
  44. {
  45. return (n >> (8 * p) & 255);
  46. }
  47. void RadixSort(std::array<long int, g_arrayElements> &array)
  48. { long int b[g_arrayElements];
  49. int k = sizeof(int);
  50. for(int i = 0; i < k; i++) {
  51. int c[256] = {0};
  52. for(long int j = 0; j < g_arrayElements; j++)
  53. {
  54. c[digit(array[j],i)]++;
  55. }
  56. for(int j = 1; j < 256;j++) {
  57. c[j] += c[j-1];
  58. }
  59. for(long int j = g_arrayElements - 1; j >-1;j--){
  60. b[--c[digit(array[j], i)]] = array[j];
  61. }
  62. for (long int j = 0; j < g_arrayElements; j++) {
  63. array[j] = b[j];
  64. }
  65. }
  66. }
  67.  
  68. void merge(std::array<long int, g_arrayElements> &array, long int l, long int m, long int r){
  69. int i, j, k;
  70. int n1 = m - l + 1;
  71. int n2 = r - m;
  72. int L[n1], R[n2];
  73.  
  74. /* Copy data to temp arrays L[] and R[] */
  75. for (i = 0; i < n1; i++)
  76. L[i] = array[l + i];
  77. for (j = 0; j < n2; j++)
  78. R[j] = array[m + 1+ j];
  79.  
  80. /* Merge the temp arrays back into arr[l..r]*/
  81. i = 0; // Initial index of first subarray
  82. j = 0; // Initial index of second subarray
  83. k = l; // Initial index of merged subarray
  84. while (i < n1 && j < n2)
  85. {
  86. if (L[i] <= R[j])
  87. {
  88. array[k] = L[i];
  89. i++;
  90. }
  91. else
  92. {
  93. array[k] = R[j];
  94. j++;
  95. }
  96. k++;
  97. }
  98.  
  99. while (i < n1)
  100. {
  101. array[k] = L[i];
  102. i++;
  103. k++;
  104. }
  105.  
  106. while (j < n2)
  107. {
  108. array[k] = R[j];
  109. j++;
  110. k++;
  111. }
  112. }
  113.  
  114. void mergeSort(std::array<long int, g_arrayElements> &array, int l, int r)
  115. {
  116. if (l < r)
  117. {
  118. int m = l+(r-l)/2;
  119. mergeSort(array, l, m);
  120. mergeSort(array, m+1, r);
  121. merge(array, l, m, r);
  122. }
  123. }
  124.  
  125. void Hoara(std::array<long int, g_arrayElements> &array, long int first, long int last){
  126. int mid, count;
  127. int f=first, l=last;
  128. mid=array[f + (l - f) / 2];
  129. do
  130. {
  131. while (array[f]<mid) f++;
  132. while (array[l]>mid) l--;
  133. if (f<=l)
  134. {
  135. count=array[f];
  136. array[f]=array[l];
  137. array[l]=count;
  138. f++;
  139. l--;
  140. }
  141. } while (f<l);
  142. if (first<l) Hoara(array, first, l);
  143. if (f<last) Hoara(array, f, last);
  144. }
  145.  
  146. int main()
  147. {
  148. std::array<long int, g_arrayElements> array;
  149. std :: cout << "Sort:" << '\n';
  150. for(int m = 0; m < 1; m++){
  151. Timer t;
  152. //std::array<long int, g_arrayElements> array;
  153. long int *mas = new long int[g_arrayElements];
  154. std :: mt19937 gen(time(0));
  155. std :: uniform_int_distribution<long int>uid(0, 100000);
  156. for (long int i = 0; i < g_arrayElements ; i++) {
  157. mas[i] = uid(gen);
  158. }
  159. std::sort(&mas[0], &mas[g_arrayElements]);
  160. delete [] mas;
  161. std::cout << "Time taken: " << t.elapsed() << '\n';
  162. }
  163. std :: cout << '\n'<< '\n' << "Insertion Sort:"<< '\n';
  164. for(int m = 0; m < 1; m++){
  165. Timer t;
  166. //std::array<long int, g_arrayElements> array;
  167. std :: mt19937 gen(time(0));
  168. std :: uniform_int_distribution<long int>uid(0, 100000);
  169. for (long int i = 0; i < g_arrayElements ; i++) {
  170. array[i] = uid(gen);
  171. }
  172. InsertionSort(array);
  173. std::cout << "Time taken: " << t.elapsed() << '\n';
  174. }
  175. std :: cout << '\n'<< '\n' << "Radix Sort:"<< '\n';
  176. for(int m = 0; m < 1; m++){
  177. Timer t;
  178. //std::array<long int, g_arrayElements> array;
  179. std :: mt19937 gen(time(0));
  180. std :: uniform_int_distribution<long int>uid(0, 100000);
  181. for (long int i = 0; i < g_arrayElements ; i++) {
  182. array[i] = uid(gen);
  183. }
  184. RadixSort(array);
  185. std::cout << "Time taken: " << t.elapsed() << '\n';
  186. }
  187. //std::array<long int, g_arrayElements> array;
  188. std :: cout << '\n'<< '\n' << "Merge Sort:"<< '\n';
  189. for(int m = 0; m < 7; m++){
  190. Timer t;
  191. std :: mt19937 gen(time(0));
  192. std :: uniform_int_distribution<long int>uid(0, 100000);
  193. for (long int i = 0; i < g_arrayElements ; i++) {
  194. array[i] = uid(gen);
  195. }
  196. mergeSort(array, 0, g_arrayElements - 1);
  197. std::cout << "Time taken: " << t.elapsed() << '\n';
  198. }
  199. std :: cout << '\n'<< '\n' << "Hoara Sort:"<< '\n';
  200. for(int m = 0; m < 7; m++){
  201. Timer t;
  202. std :: mt19937 gen(time(0));
  203. std :: uniform_int_distribution<long int>uid(0, 100000);
  204. for (long int i = 0; i < g_arrayElements ; i++) {
  205. array[i] = uid(gen);
  206. }
  207. Hoara(array, 0, g_arrayElements - 1);
  208. std::cout << "Time taken: " << t.elapsed() << '\n';
  209. }
  210. return 0;
  211. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement