Pagini recente » Cod sursa (job #1055754) | Cod sursa (job #1532822) | Cod sursa (job #1769051) | Cod sursa (job #1267726) | Cod sursa (job #1264784)
#include <stdio.h>
#include <stdlib.h>
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], a[pivotIndex]);
for (int i = left; i < right; ++ i) {
if (a[i] <= a[right]) {
swap(a[finalPivot], a[i]);
++ finalPivot;
}
}
swap(a[finalPivot], a[right]); // 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 - 1;
while (tmpK > 0) {
int randPivot = left + ((right - left) >> 1);
int tmpPosition = partition(a, left, right, randPivot);
if ((tmpPosition - left + 1) == tmpK) { // we found the kth elt
break;
} else if ((tmpPosition - left + 1) < tmpK) {
tmpK -= (tmpPosition - left + 1);
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 = new int[n];
for (int i = 0; i < n; ++ i) {
scanf("%d", &a[i]);
}
printf("%d\n", select(a, n, k));
delete []a;
fclose(stdout);
fclose(stdin);
return 0;
}