Advertisement
smatskevich

KStatisticsWithTiming

Apr 1st, 2017
323
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.61 KB | None | 0 0
  1. #include <assert.h>
  2. #include <time.h>
  3. #include <iostream>
  4. #include <vector>
  5. using std::vector;
  6.  
  7. // Разделение подмассива по опорному элементу. В качестве опорного берется последний.
  8. // left, right - границы подмассива. left включается, right не включается.
  9. // Возвращает индекс опорного элемента.
  10. int Partition( vector<int>& arr, int left, int right )
  11. {
  12.     assert( right > left );
  13.     int pivot = arr[right - 1];
  14.     int i = left;
  15.     int j = right - 2;
  16.  
  17.     while( i <= j ) {
  18.         for( ; arr[i] < pivot; ++i );
  19.         for( ; j >= left && !( arr[j] < pivot ); --j ) {}
  20.         if( i < j ) {
  21.             std::swap( arr[i], arr[j] );
  22.         }
  23.     }
  24.     std::swap( arr[i], arr[right - 1] );
  25.     return i;
  26. }
  27.  
  28. // Поиск k-ой порядковой статистики.
  29. int KStatistics( vector<int>& arr, int k )
  30. {
  31.     assert( k >= 0 );
  32.     assert( k < static_cast<int>( arr.size() ) );
  33.  
  34.     int left = 0;
  35.     int right = arr.size();
  36.     while( true ) {
  37.         int pivotPos = Partition( arr, left, right );
  38.         if( pivotPos == k ) {
  39.             return arr[k];
  40.         } else if( pivotPos < k ) {
  41.             left = pivotPos + 1;
  42.         } else {
  43.             right = pivotPos;
  44.         }
  45.     }
  46. }
  47.  
  48. int main()
  49. {
  50. //  freopen( "in.txt", "r", stdin );
  51. //  freopen( "out.txt", "w", stdout );
  52.  
  53.     int n = 0;
  54.     std::cin >> n;
  55.     int k = 0;
  56.     std::cin >> k;
  57.     vector<int> arr( n, 0 );
  58.     for( int i = 0; i < n; ++i ) {
  59.         std::cin >> arr[i];
  60.     }
  61.  
  62.     clock_t start = clock();
  63.     std::cout << KStatistics( arr, k ) << std::endl;
  64.     clock_t end = clock();
  65.  
  66.     std::cout << end - start;
  67.     return 0;
  68. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement