Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cmath>
- #include <climits>
- #define _CRT_DISABLE_PERFCRIT_LOCKS
- using namespace std;
- int A[10000000];
- void sift(int i, int m)
- {
- int j = i;
- int k = i * 2 + 1; // левый сын
- int temp;
- while (k <= m) // если номер k существует (<= m, номеру последнего элемента) ИЛИ если k вообще существующий номер
- {
- if (k < m && A[k] > A[k + 1]) // k + 1 сущ-т только при k < m (сравнение со следующим элементом посл-и, с правым сыном)
- {
- k++; // то есть, при таком условии и так всё хорошо, так что просто увеличиваем k
- }
- if (A[j] > A[k]) // то есть, если левый ребенок больше, то отец сравнивается с левым, если правый - с правым
- {
- temp = A[k];
- A[k] = A[j];
- A[j] = temp; // в тогу родитель меняется с большим из детей (если дите больше родителя)
- j = k;
- k = k * 2 + 1; // пойдет проверять детей того ребенка, который только что поменялся с папашей
- }
- else
- {
- break;
- }
- }
- }
- // Алгоритм пирамидальной сортировки
- void heap_sort(int n)
- {
- int i, m;
- int temp;
- // построение пирамиды
- for (i = n / 2; i >= 0; i--)
- {
- sift(i, n - 1);
- }
- // сортировка массива
- for (m = n - 1; m >= 1; m--) // он будет постоянно менять самый корень с последним листом, потом с предпоследним и т.д.
- { // в процедуре проталкивая вниз те, что поменьше и вверх, что побольше
- temp = A[0]; // в итоге каждый раз самый последний лист будет со своим значением
- A[0] = A[m]; // из-за того, что пирамида уже построена правильно, каждый раз вверх поднимается наибольшее
- A[m] = temp; // и потом меняется с каким-то маленьким из листьев, что "на очереди" и так снова и снова
- sift(0, m - 1);
- }
- }
- int main()
- {
- freopen("input.txt", "r", stdin);
- freopen("output.txt", "w", stdout);
- cin.tie(NULL);
- int n, k;
- ios_base::sync_with_stdio(false);
- cin >> n >> k;
- for (int i = 0; i < n; i++)
- {
- cin >> A[i];
- }
- heap_sort(n);
- ios_base::sync_with_stdio(false);
- cout << A[k - 1];
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement