Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <algorithm>
- #include <iostream>
- #include <cstdlib>
- #include <iomanip>
- #include <string>
- #include <vector>
- #include <cmath>
- using namespace std;
- typedef vector <int> vi;
- // функция, "просеивающая" элемент кучи с индексом i,
- // в соответствии с тем, какую сортировку нужно сделать (по возрастанию или убыванию)
- void siftDown (vi &v, int i, int heapSize, int par)
- {
- if (par > 0)
- while (2 * i + 1 < heapSize)
- {
- int left = 2 * i + 1;
- int right = 2 * i + 2;
- int j = (right < heapSize && v[right] > v[left])? right : left;
- if (v[i] >= v[j]) break;
- swap(v[i], v[j]);
- i = j;
- }
- else
- while (2 * i + 1 < heapSize)
- {
- int left = 2 * i + 1;
- int right = 2 * i + 2;
- int j = (right < heapSize && v[right] < v[left])? right : left;
- if (v[i] <= v[j]) break;
- swap(v[i], v[j]);
- i = j;
- }
- }
- // сортировка кучей
- void heapSort (vi &v, int par)
- {
- if (par > 0) // сортировка по возрастанию
- {
- // создание кучи в виде массива с МАКСИМАЛЬНЫМ элементом в корне кучи
- for (int i = v.size() / 2 - 1; i >= 0; --i)
- siftDown(v, i, v.size(), par);
- int heapSize = v.size();
- for (int i = 0; i < v.size() - 1; ++i)
- {
- // v[0] - максимальный элемент, поскольку находится в корне кучи
- // поэтому его можно переместить в конец вектора, а размер кучи уменьшить на 1
- swap(v[0], v[v.size() - 1 - i]);
- siftDown(v, 0, --heapSize, par);
- }
- }
- else if (par < 0) // сортировка по убыванию
- {
- // создание кучи в виде массива с МИНИМАЛЬНЫМ элементом в корне кучи
- for (int i = v.size() / 2 - 1; i >= 0; --i)
- siftDown(v, i, v.size(), par);
- int heapSize = v.size();
- for (int i = 0; i < v.size() - 1; ++i)
- {
- // v[0] - минимальный элемент, поскольку находится в корне кучи
- // поэтому его можно переместить в конец вектора, а размер кучи уменьшить на 1
- swap(v[0], v[v.size() - 1 - i]);
- siftDown(v, 0, --heapSize, par);
- }
- }
- }
- // вывод на экран двумерного массива
- void print (vector <vi> v)
- {
- cout << left;
- for (int i = 0; i < v.size(); ++i, cout << '\n')
- for (int j = 0; j < v[i].size(); ++j)
- cout << setw(4) << v[i][j];
- cout << '\n';
- }
- // вывод на экран одномерного массива
- void print (vi v)
- {
- cout << left;
- for (int i = 0; i < v.size(); ++i)
- cout << setw(4) << v[i];
- cout << '\n';
- }
- int main()
- {
- int n; cout << "n = "; cin >> n;
- vector <vi> v (n, vi (n));
- for (int i = 0; i < n; ++i)
- for (int j = 0; j < n; ++j)
- v[i][j] = rand() % 100;
- cout << "\nВектор v: \n";
- print(v);
- cout << "\nДиагонали:\n";
- for (int k = 0; k < 2 * n - 1; ++k)
- {
- vi d; // вектор элементов некоторой диагонали вектора v
- for (int i = 0; i < n; ++i)
- {
- int j = i - k + n - 1;
- if (0 <= j && j < n) d.push_back(v[i][j]);
- }
- heapSort(d, n - k - 1);
- print(d);
- int index = 0;
- for (int i = 0; i < n; ++i)
- {
- int j = i - k + n - 1;
- if (0 <= j && j < n) { v[i][j] = d[index]; ++index; }
- }
- }
- cout << "\nВектор v: \n";
- print(v);
- return 0;
- }
Add Comment
Please, Sign In to add comment