Pagini recente » Cod sursa (job #2269244) | Cod sursa (job #2775286) | Cod sursa (job #265061) | Cod sursa (job #2851934) | Cod sursa (job #1262227)
#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 - 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;
}