Guest User

Untitled

a guest
Oct 22nd, 2017
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.48 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. template <typename T>
  6. int mediana(T *arr, int left, int right){
  7. T first = arr[left];
  8. T mid = arr[(left + right) / 2];
  9. T last = arr[right - 1];
  10.  
  11. if ((mid <= first && first <= last) || (last <= first && first <= mid)){ return left; }
  12. if ((first <= mid && mid <= last) || (last <= mid && mid <= first)) { return (left + right) / 2; }
  13. if ((mid <= last && last <= first) || (first <= last && last <= mid)) { return right - 1; }
  14. }
  15.  
  16. template <typename T>
  17. int Partition(T *arr, int left, int right){
  18. int index = mediana(arr, left, right);
  19. swap(arr[index], arr[right - 1]);
  20. T pivot = arr[right - 1];
  21. int i = left; int j = left;
  22. while (j < right) {
  23. if (arr[j] > pivot) {
  24. j++;
  25. } else {
  26. swap(arr[i], arr[j]);
  27. i++;
  28. j++;
  29. }
  30. }
  31. return i - 1;
  32. }
  33.  
  34. template <typename T>
  35. int KStatDC(T *arr, int n, int k){
  36. int left = 0;
  37. int right = n;
  38.  
  39. while (left < right){
  40. int indexPivot = Partition(arr, left, right);
  41. if (indexPivot == k){
  42. return arr[indexPivot];
  43. }else{
  44. if (k > indexPivot){
  45. left = indexPivot + 1;
  46. }else{
  47. right = indexPivot;
  48. }
  49. }
  50. }
  51. }
  52.  
  53. int main() {
  54. int n, k;
  55. cin >> n >> k;
  56. int *arr = new int[n];
  57. for (int i = 0; i < n; ++i){
  58. cin >> arr[i];
  59. }
  60.  
  61. cout << KStatDC(arr, n, k);
  62. delete[] arr;
  63. return 0;
  64. }
Add Comment
Please, Sign In to add comment