Advertisement
Tvor0zhok

Быстрая сортировка

May 19th, 2021
135
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.44 KB | None | 0 0
  1. #include <algorithm>
  2. #include <iostream>
  3. #include <cstdlib>
  4. #include <iomanip>
  5. #include <string>
  6. #include <vector>
  7. #include <cmath>
  8. using namespace std;
  9.  
  10. typedef vector <int> vi;
  11.  
  12. // быстрая сортировка
  13. void quickSort (vi &v, int l, int r, int par)
  14. {
  15. if (par > 0) // сортировка по возрастанию
  16. if (l >= r) return; // подмассив длины 1 или l > r
  17. else
  18. {
  19. int m = v[(l + r) / 2];
  20.  
  21. int li = l, ri = r;
  22.  
  23. // разделяем массив на 2 подмассива:
  24. // в 1-ом подмассиве любой элемент < m
  25. // во 2-ом подмассиве любой элемент >= m
  26. while (li <= ri)
  27. {
  28. while (v[li] < m) ++li;
  29. while (v[ri] > m) --ri;
  30.  
  31. if (li >= ri) break;
  32.  
  33. swap(v[li++], v[ri--]);
  34. }
  35.  
  36. quickSort(v, l, ri, par);
  37. quickSort(v, ri + 1, r, par);
  38. }
  39. else if (par < 0) // сортировка по убыванию
  40. if (l >= r) return; // подмассив длины 1 или l > r
  41. else
  42. {
  43. int m = v[(l + r) / 2];
  44.  
  45. int li = l, ri = r;
  46.  
  47. // разделяем массив на 2 подмассива:
  48. // в 1-ом подмассиве любой элемент >= m
  49. // во 2-ом подмассиве любой элемент <= m
  50. while (li <= ri)
  51. {
  52. while (v[li] > m) ++li;
  53. while (v[ri] < m) --ri;
  54.  
  55. if (li >= ri) break;
  56.  
  57. swap(v[li++], v[ri--]);
  58. }
  59.  
  60. quickSort(v, l, ri, par);
  61. quickSort(v, ri + 1, r, par);
  62. }
  63. }
  64.  
  65. // вывод на экран двумерного массива
  66. void print (vector <vi> v)
  67. {
  68. cout << left;
  69.  
  70. for (int i = 0; i < v.size(); ++i, cout << '\n')
  71. for (int j = 0; j < v[i].size(); ++j)
  72. cout << setw(4) << v[i][j];
  73.  
  74. cout << '\n';
  75. }
  76.  
  77. // вывод на экран одномерного массива
  78. void print (vi v)
  79. {
  80. cout << left;
  81.  
  82. for (int i = 0; i < v.size(); ++i)
  83. cout << setw(4) << v[i];
  84.  
  85. cout << '\n';
  86. }
  87.  
  88. int main()
  89. {
  90. int n; cout << "n = "; cin >> n;
  91.  
  92. vector <vi> v (n, vi (n));
  93.  
  94. for (int i = 0; i < n; ++i)
  95. for (int j = 0; j < n; ++j)
  96. v[i][j] = rand() % 100;
  97.  
  98. cout << "\nВектор v: \n";
  99. print(v);
  100.  
  101. cout << "\nДиагонали:\n";
  102.  
  103. for (int k = 0; k < 2 * n - 1; ++k)
  104. {
  105. vi d; // вектор элементов некоторой диагонали вектора v
  106.  
  107. for (int i = 0; i < n; ++i)
  108. {
  109. int j = i - k + n - 1;
  110.  
  111. if (0 <= j && j < n) d.push_back(v[i][j]);
  112. }
  113.  
  114. quickSort(d, 0, d.size() - 1, n - k - 1);
  115. print(d);
  116.  
  117. int index = 0;
  118.  
  119. for (int i = 0; i < n; ++i)
  120. {
  121. int j = i - k + n - 1;
  122.  
  123. if (0 <= j && j < n) { v[i][j] = d[index]; ++index; }
  124. }
  125. }
  126.  
  127. cout << "\nВектор v: \n";
  128. print(v);
  129.  
  130. return 0;
  131. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement