Pagini recente » Cod sursa (job #1268861) | Cod sursa (job #1617027) | Cod sursa (job #129730) | Cod sursa (job #509119) | Cod sursa (job #1262225)
//
// main.cpp
// OrderStatistic
//
// Created by Maria on 12/11/14.
// Copyright (c) 2014 Maria. All rights reserved.
//
#include <iostream>
#include <fstream>
#include <stdio.h>
using namespace std;
void swap(int &a, int &b) {
int tmp = a;
a = b;
b = tmp;
}
int partition(int a[], int left, int right, int pivotIndex) {
int finalPivot = left;
swap(a[right - 1], a[pivotIndex]);
for (int i = left; i < right - 1; ++ i) {
if (a[i] <= a[right - 1]) {
swap(a[finalPivot], a[i]);
++ finalPivot;
}
}
swap(a[finalPivot], a[right - 1]); // put pivot in its final place
return finalPivot;
}
int select(int a[], int n, int k) {
int tmpK = k;
int left = 0;
int right = n;
while (tmpK > 0) {
int randPivot = left + rand() % (right - left + 1);
int tmpPosition = partition(a, left, right, randPivot);
if ((tmpPosition - left)== tmpK) {
break;
} else if (tmpPosition < tmpK) {
tmpK -= tmpPosition;
left = tmpPosition + 1;
} else {
right = tmpPosition - 1;
}
}
return a[left + tmpK - 1];
}
int main(int argc, const char * argv[]) {
int n, k;
freopen("sdo.in", "r", stdin);
freopen("sdo.out", "w", stdout);
scanf("%d%d", &n, &k);
int a[n];
for (int i = 0; i < n; ++ i) {
scanf("%d", &a[i]);
}
printf("%d\n", select(a, n, k));
fclose(stdout);
fclose(stdin);
return 0;
}