Advertisement
Guest User

NikolaevMisha/3.1/new

a guest
Oct 21st, 2018
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.05 KB | None | 0 0
  1. #include <iostream>
  2. /*
  3. Даны неотрицательные целые числа n,k и массив целых чисел из [0..10^9] размера n. Требуется найти k-ю порядковую статистику. т.е. напечатать число, которое бы стояло на позиции с индексом k (0..n-1) в отсортированном массиве. Напишите нерекурсивный алгоритм.
  4. Требования к дополнительной памяти: O(n). Требуемое среднее время работы: O(n).
  5. Функцию Partition следует реализовывать методом прохода двумя итераторами в одном направлении. Описание для случая прохода от начала массива к концу:
  6. Выбирается опорный элемент. Опорный элемент меняется с последним элементом массива.
  7. Во время работы Partition в начале массива содержатся элементы, не бОльшие опорного. Затем располагаются элементы, строго бОльшие опорного. В конце массива лежат нерассмотренные элементы. Последним элементом лежит опорный.
  8. Итератор (индекс) i указывает на начало группы элементов, строго бОльших опорного.
  9. Итератор j больше i, итератор j указывает на первый нерассмотренный элемент.
  10. Шаг алгоритма. Рассматривается элемент, на который указывает j. Если он больше опорного, то сдвигаем j.
  11. Если он не больше опорного, то меняем a[i] и a[j] местами, сдвигаем i и сдвигаем j.
  12. В конце работы алгоритма меняем опорный и элемент, на который указывает итератор i.
  13.  
  14. 3_1. Реализуйте стратегию выбора опорного элемента “медиана трёх”. Функцию Partition реализуйте методом прохода двумя итераторами от начала массива к концу.
  15.  
  16. */
  17.  
  18.  
  19. int medium(int* arr, int i, int j, int k) // находит медиану трех
  20. {
  21.     if( (arr[i] <= arr[j]) && (arr[j] <= arr[k]))
  22.     {
  23.         return j;
  24.     }
  25.     if( (arr[k] <= arr[j]) && (arr[j] <= arr[i]))
  26.     {
  27.         return j;
  28.     }
  29.     if( (arr[j] <= arr[k]) && (arr[k] <= arr[i]))
  30.     {
  31.         return k;
  32.     }
  33.     if( (arr[i] <= arr[k]) && (arr[k] <= arr[j]))
  34.     {
  35.         return k;
  36.     }
  37.     if( (arr[j] <= arr[i]) && (arr[i] <= arr[k]))
  38.     {
  39.         return i;
  40.     }
  41.     if( (arr[k] <= arr[i]) && (arr[i] <= arr[j]))
  42.     {
  43.         return i;
  44.     }
  45.  
  46. }
  47.  
  48. int main()
  49. {
  50.  
  51.     int n;
  52.     std::cin >> n;
  53.     int k;
  54.     std::cin >> k;
  55.     int A[n];
  56.     for(int i = 0; i < n; ++ i)
  57.     {
  58.         std::cin >> A[i];
  59.     }
  60.  
  61.     int i = 0;
  62.     int j = 0;
  63.     int start = 0;
  64.     int finish = n-1;
  65.     do
  66.     {
  67.         std::swap(A[finish] , A[medium(A , start , finish, (start + finish)/2)]); // реализация Partition
  68.         while(j < finish)
  69.         {
  70.             if(A[j] > A[finish])
  71.             {
  72.                 ++j;
  73.             }
  74.             else
  75.             {
  76.                 std:: swap(A[j] , A[i]);
  77.                 ++i;
  78.                 ++j;
  79.             }
  80.         }
  81.         std::swap(A[finish] , A[i]);
  82.         if(i == k)
  83.         {
  84.             break;
  85.         }
  86.         if(i < k)
  87.         {
  88.             ++i;
  89.             j = i;
  90.             start = i;
  91.         }
  92.         if(i > k)
  93.         {
  94.             finish = i - 1;
  95.             i =  start;
  96.             j = start;
  97.         }
  98.     }
  99.     while(true);
  100.     std::cout << A[i];
  101.     return 0;
  102. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement