Advertisement
citizenof17

Untitled

Mar 1st, 2017
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.39 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <time.h>
  4. #include <algorithm>
  5. #include <Windows.h>
  6.  
  7. using namespace std;
  8.  
  9. void mergeSort(vector<int>&, int, int, vector<int> &temp);
  10. void merge(vector<int>&, int, int, int, vector<int> &temp);
  11.  
  12. void mergeSort(vector<int> &a, int l, int r, vector<int> &temp)
  13. {
  14. if (r > l){ //если больше 1 элемента
  15. int mid = (r + l) / 2; //выбираем середину
  16.  
  17. mergeSort(a, l, mid, temp); //разделяем левую половину
  18. temp.resize(0);
  19. mergeSort(a, mid + 1, r, temp); //разделяем правую половину
  20. temp.resize(0);
  21. merge(a, l, mid, r, temp); //сливаем левую и праву половину
  22. }
  23. }
  24.  
  25. void merge(vector<int> &a, int l, int mid, int r, vector<int> &temp)
  26. {
  27. //vector<int> temp; //вспомогательный массив
  28.  
  29. int i = l;
  30. int j = mid + 1;
  31.  
  32. while(i <= mid && j <= r){ //пока обе половины не пустые
  33. if (a[i] <= a[j]){ //если элемент их левой половины меньше
  34. temp.push_back(a[i]); //то записываем его
  35. i++;
  36. }else{
  37. temp.push_back(a[j]); //иначе берём элемент из правой половины
  38. j++;
  39. }
  40. }
  41.  
  42. while(i <= mid){ //если еще есть элементы в левой части, то дописываем их
  43. temp.push_back(a[i]);
  44. i++;
  45. }
  46.  
  47. while(j <= r){
  48. temp.push_back(a[j]); //если еще есть элементы в правой части, то дописываем их
  49. j++;
  50. }
  51.  
  52. i = 0;
  53.  
  54. while(l <= r){ //переписываем элементы из вспомогательного массива в основной
  55. a[l] = temp[i];
  56. l++;
  57. i++;
  58. }
  59. }
  60.  
  61. int main()
  62. {
  63. freopen("input.txt", "r", stdin);
  64. freopen("output.txt", "w", stdout);
  65.  
  66. srand(time(NULL));
  67.  
  68. int n;
  69.  
  70. n = 15000;
  71.  
  72. vector<int> a(n);
  73.  
  74. for (int i = 0; i < n; i++) // считываем изначальный массив
  75. {
  76. a[i] = rand() % 1000000;
  77. }
  78.  
  79. auto ti1 = GetTickCount();
  80. vector<int> temp;
  81.  
  82. mergeSort(a, 0, a.size() - 1, temp); //выполняем сортировку
  83.  
  84. auto ti2 = GetTickCount();
  85.  
  86. cout << (double)(ti2 - ti1) << " milliseconds" << endl;
  87.  
  88. for (int i = 0; i < n; i++) // выводим отсортированный массив
  89. {
  90. cout << a[i] << " ";
  91. }
  92.  
  93. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement