Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- using namespace std;
- template <typename T>
- int mediana(T *arr, int left, int right){
- T first = arr[left];
- T mid = arr[(left + right) / 2];
- T last = arr[right - 1];
- if ((mid <= first && first <= last) || (last <= first && first <= mid)){ return left; }
- if ((first <= mid && mid <= last) || (last <= mid && mid <= first)) { return (left + right) / 2; }
- if ((mid <= last && last <= first) || (first <= last && last <= mid)) { return right - 1; }
- }
- template <typename T>
- int Partition(T *arr, int left, int right){
- int index = mediana(arr, left, right);
- swap(arr[index], arr[right - 1]);
- T pivot = arr[right - 1];
- int i = left; int j = left;
- while (j < right) {
- if (arr[j] > pivot) {
- j++;
- } else {
- swap(arr[i], arr[j]);
- i++;
- j++;
- }
- }
- return i - 1;
- }
- template <typename T>
- int KStatDC(T *arr, int n, int k){
- int left = 0;
- int right = n;
- while (left < right){
- int indexPivot = Partition(arr, left, right);
- if (indexPivot == k){
- return arr[indexPivot];
- }else{
- if (k > indexPivot){
- left = indexPivot + 1;
- }else{
- right = indexPivot;
- }
- }
- }
- }
- int main() {
- int n, k;
- cin >> n >> k;
- int *arr = new int[n];
- for (int i = 0; i < n; ++i){
- cin >> arr[i];
- }
- cout << KStatDC(arr, n, k);
- delete[] arr;
- return 0;
- }
Add Comment
Please, Sign In to add comment