Pagini recente » Cod sursa (job #3186181) | Istoria paginii utilizator/zavragiu | Cod sursa (job #2270909)
#include <fstream>
#include <cstdlib>
#include <cstdio>
#include <ctime>
#include <climits>
#include <algorithm>
#define NMAX 10001
using namespace std;
int partition(int v[], int low, int high)
{
int pivot = v[high];
int i = low - 1;
for (int j = low; j < high; j++)
{
if (v[j] <= pivot)
{
i++;
swap(v[i], v[j]);
}
}
swap(v[i + 1], v[high]);
return i+1;
}
int randomizedPartition(int v[], int low, int high)
{
int i = (rand() % (high - low + 1)) + low;
swap(v[ high ], v[ i ]);
return partition(v, low, high);
}
int quickSelect(int v[], int low, int high, int k)
{
if (k > 0 && k <= high - low + 1)
{
int index = randomizedPartition(v, low, high);
if (index - low == k - 1)
return v[index];
if (index - low > k - 1)
return quickSelect(v, low, index - 1, k);
return quickSelect(v, index + 1, high,k - index + low - 1);
}
return INT_MAX;
}
int main()
{
int v[3000001];
ifstream f ("sdo.in");
ofstream g ("sdo.out");
int n, k;
f >> n >> k;
for ( int i = 1; i <= n; ++ i )
f >> v[ i ];
g << quickSelect( v, 1, n, k );
return 0;
}