Advertisement
Guest User

Untitled

a guest
Jan 19th, 2020
119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.74 KB | None | 0 0
  1. #include <iostream>
  2. #include <cmath>
  3. #include <climits>
  4. #define _CRT_DISABLE_PERFCRIT_LOCKS
  5.  
  6. using namespace std;
  7. int A[10000000];
  8.  
  9.  
  10. void sift(int i, int m)
  11. {
  12.     int j = i;
  13.     int k = i * 2 + 1; // левый сын
  14.     int temp;
  15.     while (k <= m) // если номер k существует (<= m, номеру последнего элемента) ИЛИ если k вообще существующий номер
  16.     {
  17.         if (k < m && A[k] > A[k + 1]) // k + 1 сущ-т только при k < m (сравнение со следующим элементом посл-и, с правым сыном)
  18.         {
  19.             k++; // то есть, при таком условии и так всё хорошо, так что просто увеличиваем k
  20.         }
  21.         if (A[j] > A[k]) // то есть, если левый ребенок больше, то отец сравнивается с левым, если правый - с правым
  22.         {
  23.             temp = A[k];
  24.             A[k] = A[j];
  25.             A[j] = temp; // в тогу родитель меняется с большим из детей (если дите больше родителя)
  26.  
  27.             j = k;
  28.             k = k * 2 + 1; // пойдет проверять детей того ребенка, который только что поменялся с папашей
  29.         }
  30.         else
  31.         {
  32.             break;
  33.         }
  34.     }
  35. }
  36.  
  37.  
  38. // Алгоритм пирамидальной сортировки
  39. void heap_sort(int n)
  40. {
  41.     int i, m;
  42.     int temp;
  43.  
  44.     // построение пирамиды
  45.     for (i = n / 2; i >= 0; i--)
  46.     {
  47.         sift(i, n - 1);
  48.     }
  49.  
  50.     // сортировка массива
  51.     for (m = n - 1; m >= 1; m--) // он будет постоянно менять самый корень с последним листом, потом с предпоследним и т.д.
  52.     {                           // в процедуре проталкивая вниз те, что поменьше и вверх, что побольше
  53.         temp = A[0];            // в итоге каждый раз самый последний лист будет со своим значением
  54.         A[0] = A[m];            // из-за того, что пирамида уже построена правильно, каждый раз вверх поднимается наибольшее
  55.         A[m] = temp;            // и потом меняется с каким-то маленьким из листьев, что "на очереди" и так снова и снова
  56.  
  57.         sift(0, m - 1);
  58.     }
  59. }
  60.  
  61.  
  62.  
  63. int main()
  64. {
  65.     freopen("input.txt", "r", stdin);
  66.     freopen("output.txt", "w", stdout);
  67.  
  68.     cin.tie(NULL);
  69.  
  70.     int n, k;
  71.     ios_base::sync_with_stdio(false);
  72.     cin >> n >> k;
  73.  
  74.     for (int i = 0; i < n; i++)
  75.     {
  76.         cin >> A[i];
  77.     }
  78.  
  79.     heap_sort(n);
  80.  
  81.     ios_base::sync_with_stdio(false);
  82.     cout << A[k - 1];
  83.  
  84.     return 0;
  85. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement