Pagini recente » Sandbox (cutiuţa cu năsip) | Cod sursa (job #1596088) | Cod sursa (job #639320) | Cod sursa (job #2609956) | Cod sursa (job #2619539)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("sdo.in");
ofstream fout("sdo.out");
int partitie(int v[], int st, int dr) {
int pivot, index, i;
index = st;
pivot = dr;
for(i=st; i < dr; i++) {
// finding index of pivot.
if(v[i] < v[pivot]) {
swap(v[i], v[index]);
index++;
}
}
swap(v[pivot], v[index]);
return index;
}
int pivotRandom(int v[], int st, int dr){
// alegem un pivot random
int pvt, n;
n = rand();
pvt = st + n%(dr-st+1); // randomizam pivotul cu ajutorul st,dr
swap(v[dr], v[pvt]);
return partitie(v, st, dr);
}
//algoritm asemanator cu quicksort care rezolva doar partitia care il contine pe elementul k
int quick_select(int v[], int st, int dr,int k) {
int pindex,aux;
if(st==dr)
{
return v[st];
}
pindex = pivotRandom(v, st, dr);//alegem pivotul random
aux=pindex-st+1;
if(k<=aux)//verificam care partitie il contine pe k
{
quick_select(v, st, pindex,k);
}
else
{
quick_select(v, pindex+1, dr,k-aux);
}
}
int main()
{
int v[3000005];
int n,k;
fin>>n>>k;
for(int i=0;i<n;i++)
{
fin>>v[i];
}
fout<<quick_select(v,0,n-1,k-1);
return 0;
}