Guest User

Untitled

a guest
Dec 12th, 2017
122
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.59 KB | None | 0 0
  1. /*Напишите эффективную функцию находящую k-ую порядковую статистику в массиве. Программа должна состоять из этой функции и примера её использования в main.*/
  2.  
  3.  
  4.  
  5.  
  6. #include <iostream>
  7. using namespace std;
  8.  
  9. int findOrderStatistic(int * a, int n, int k) {
  10. int left = 1, right = n;
  11. while (true) {
  12. if (right <= left + 1) {
  13. if (right == left + 1 && a[right] < a[left]) {
  14. swap (a[left], a[right]);
  15. }
  16. return a[k];
  17. }
  18.  
  19. // упорядочиваем a[left], a[left + 1], a[right]
  20. int mid = (left + right) >> 1;
  21. swap(a[mid], a[left + 1]);
  22. if (a[left] > a[right]) {
  23. swap (a[left], a[right]);
  24. } if (a[left + 1] > a[right]) {
  25. swap (a[left + 1], a[right]);
  26. } if (a[left] > a[left + 1]) {
  27. swap(a[left], a[left + 1]);
  28. }
  29.  
  30. // выполняем разделение
  31. // барьером является a[left + 1], т.е. медиана среди a[left], a[left + 1], a[right]
  32. int i = left + 1;
  33. int j = right;
  34. int current = a[left + 1];
  35. while (true) {
  36. while (a[++i] < current);
  37. while (a[--j] > current);
  38. if (i > j) {
  39. break;
  40. }
  41. swap(a[i], a[j]);
  42. }
  43.  
  44. // вставляем барьер
  45. a[left + 1] = a[j];
  46. a[j] = current;
  47.  
  48. // продолжаем работать в той части,
  49. // которая должна содержать искомый элемент
  50. if (j >= k) {
  51. right = j - 1;
  52. } if (j <= k) {
  53. left = i;
  54. }
  55. }
  56. }
  57.  
  58. int main() {
  59. int a[] = {1, 3, 5, 7, 7};
  60. cout << findOrderStatistic(a, 5, 3);
  61.  
  62. return 0;
  63. }
Add Comment
Please, Sign In to add comment