Advertisement
smatskevich

FindKStatistics

Oct 10th, 2016
355
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.18 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. using std::vector;
  4. using std::cin;
  5. using std::cout;
  6.  
  7. // Выполняет разделение массива. Возвращает позицию опорного элемента.
  8. int Partition( vector<int>& arr, int begin, int end )
  9. {
  10.     int pivot = arr[end - 1];
  11.     int i = begin;
  12.     int j = end - 2;
  13.     while( i <= j ) {
  14.         for( ; arr[i] < pivot; ++i ) {}
  15.         for( ; j >= begin && arr[j] >= pivot; --j ) {}
  16.         if( i < j ) {
  17.             std::swap( arr[i++], arr[j--] );
  18.         }
  19.     }
  20.     // i - позиция первого элемента, больше либо равного опорного.
  21.     std::swap( arr[i], arr[end - 1] );
  22.     return i;
  23. }
  24.  
  25. int FindKStatistics( vector<int>& arr, int k )
  26. {
  27.     int begin = 0;
  28.     int end = static_cast<int>( arr.size() );
  29.     while( true ) {
  30.         int pivotPos = Partition( arr, begin, end );
  31.         if( pivotPos == k ) {
  32.             return arr[k];
  33.         }
  34.         if( pivotPos < k ) {
  35.             begin = pivotPos + 1;
  36.         } else {
  37.             end = pivotPos;
  38.         }
  39.     }
  40. }
  41.  
  42. int main()
  43. {
  44.     int n = 0;
  45.     cin >> n;
  46.     int k = 0;
  47.     cin >> k;
  48.  
  49.     vector<int> arr( n, 0 );
  50.     for( int i = 0; i < n; ++i ){
  51.         cin >> arr[i];
  52.     }
  53.  
  54.     cout << FindKStatistics( arr, k );
  55.     return 0;
  56. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement