Mai intai trebuie sa te autentifici.
Cod sursa(job #2274012)
Utilizator | Data | 1 noiembrie 2018 11:01:59 | |
---|---|---|---|
Problema | Statistici de ordine | Scor | 100 |
Compilator | cpp-64 | Status | done |
Runda | Arhiva educationala | Marime | 1.41 kb |
#include <fstream>
#include <random>
#include <ctime>
#define nmax 3000001
using namespace std;
ifstream f("sdo.in");
ofstream g("sdo.out");
int N, i, A[nmax], K;
int choose_pivot(int *v, int left, int right) {
int rand1 = left + rand() % (right - left + 1);
int rand2 = left + rand() % (right - left + 1);
int rand3 = left + rand() % (right - left + 1) ;
if (v[rand1] > v[rand2]) swap(rand1, rand2);
if (v[rand1] > v[rand3]) swap(rand1, rand3);
if (v[rand2] > v[rand3]) swap(rand2, rand3);
return rand2;
}
int partition_array(int *v, int left, int right, int pivot) {
swap(v[pivot], v[right]);
int i = left - 1, j = right;
while (true) {
i++;
while (v[i] < v[right]) ++i;
j--;
while (v[j] > v[right]) --j;
if (j <= i) {
swap(v[j + 1], v[right]);
return j + 1;
}
swap(v[i], v[j]);
}
}
int qsort(int *v, int left, int right) {
int pivotPosition;
int pivot = choose_pivot(v, left, right);
pivotPosition = partition_array(v, left, right, pivot);
if (pivotPosition == K) return v[K];
else if(pivotPosition > K) return qsort(v, left, pivotPosition - 1);
else return qsort(v, pivotPosition + 1, right);
}
int main() {
f >> N >> K;
for (i = 1; i <= N; i++)
f >> A[i];
srand(time(NULL));
g << qsort(A, 1, N);
return 0;
}