Tvor0zhok

Сортировка кучей

May 19th, 2021 (edited)
129
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.26 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. // функция, "просеивающая" элемент кучи с индексом i,
  13. // в соответствии с тем, какую сортировку нужно сделать (по возрастанию или убыванию)
  14. void siftDown (vi &v, int i, int heapSize, int par)
  15. {
  16. if (par > 0)
  17. while (2 * i + 1 < heapSize)
  18. {
  19. int left = 2 * i + 1;
  20. int right = 2 * i + 2;
  21.  
  22. int j = (right < heapSize && v[right] > v[left])? right : left;
  23.  
  24. if (v[i] >= v[j]) break;
  25.  
  26. swap(v[i], v[j]);
  27.  
  28. i = j;
  29. }
  30. else
  31. while (2 * i + 1 < heapSize)
  32. {
  33. int left = 2 * i + 1;
  34. int right = 2 * i + 2;
  35.  
  36. int j = (right < heapSize && v[right] < v[left])? right : left;
  37.  
  38. if (v[i] <= v[j]) break;
  39.  
  40. swap(v[i], v[j]);
  41.  
  42. i = j;
  43. }
  44. }
  45.  
  46. // сортировка кучей
  47. void heapSort (vi &v, int par)
  48. {
  49. if (par > 0) // сортировка по возрастанию
  50. {
  51. // создание кучи в виде массива с МАКСИМАЛЬНЫМ элементом в корне кучи
  52. for (int i = v.size() / 2 - 1; i >= 0; --i)
  53. siftDown(v, i, v.size(), par);
  54.  
  55. int heapSize = v.size();
  56.  
  57. for (int i = 0; i < v.size() - 1; ++i)
  58. {
  59. // v[0] - максимальный элемент, поскольку находится в корне кучи
  60. // поэтому его можно переместить в конец вектора, а размер кучи уменьшить на 1
  61. swap(v[0], v[v.size() - 1 - i]);
  62.  
  63. siftDown(v, 0, --heapSize, par);
  64. }
  65. }
  66. else if (par < 0) // сортировка по убыванию
  67. {
  68. // создание кучи в виде массива с МИНИМАЛЬНЫМ элементом в корне кучи
  69. for (int i = v.size() / 2 - 1; i >= 0; --i)
  70. siftDown(v, i, v.size(), par);
  71.  
  72. int heapSize = v.size();
  73.  
  74. for (int i = 0; i < v.size() - 1; ++i)
  75. {
  76. // v[0] - минимальный элемент, поскольку находится в корне кучи
  77. // поэтому его можно переместить в конец вектора, а размер кучи уменьшить на 1
  78. swap(v[0], v[v.size() - 1 - i]);
  79.  
  80. siftDown(v, 0, --heapSize, par);
  81. }
  82. }
  83. }
  84.  
  85. // вывод на экран двумерного массива
  86. void print (vector <vi> v)
  87. {
  88. cout << left;
  89.  
  90. for (int i = 0; i < v.size(); ++i, cout << '\n')
  91. for (int j = 0; j < v[i].size(); ++j)
  92. cout << setw(4) << v[i][j];
  93.  
  94. cout << '\n';
  95. }
  96.  
  97. // вывод на экран одномерного массива
  98. void print (vi v)
  99. {
  100. cout << left;
  101.  
  102. for (int i = 0; i < v.size(); ++i)
  103. cout << setw(4) << v[i];
  104.  
  105. cout << '\n';
  106. }
  107.  
  108. int main()
  109. {
  110. int n; cout << "n = "; cin >> n;
  111.  
  112. vector <vi> v (n, vi (n));
  113.  
  114. for (int i = 0; i < n; ++i)
  115. for (int j = 0; j < n; ++j)
  116. v[i][j] = rand() % 100;
  117.  
  118. cout << "\nВектор v: \n";
  119. print(v);
  120.  
  121. cout << "\nДиагонали:\n";
  122.  
  123. for (int k = 0; k < 2 * n - 1; ++k)
  124. {
  125. vi d; // вектор элементов некоторой диагонали вектора v
  126.  
  127. for (int i = 0; i < n; ++i)
  128. {
  129. int j = i - k + n - 1;
  130.  
  131. if (0 <= j && j < n) d.push_back(v[i][j]);
  132. }
  133.  
  134. heapSort(d, n - k - 1);
  135. print(d);
  136.  
  137. int index = 0;
  138.  
  139. for (int i = 0; i < n; ++i)
  140. {
  141. int j = i - k + n - 1;
  142.  
  143. if (0 <= j && j < n) { v[i][j] = d[index]; ++index; }
  144. }
  145. }
  146.  
  147. cout << "\nВектор v: \n";
  148. print(v);
  149.  
  150. return 0;
  151. }
Add Comment
Please, Sign In to add comment