Pagini recente » Cod sursa (job #1077118) | Cod sursa (job #3220001) | Cod sursa (job #1756127) | Cod sursa (job #808361) | Cod sursa (job #3272219)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("sdo.in");
ofstream fout("sdo.out");
int v[3000005];
int k;
int partitie(int v[],int st,int dr){
// Mediana din trei: alege pivotul ca mediana dintre v[st], v[mid], v[dr]
int mid = (st + dr) / 2;
if (v[st] > v[mid]) swap(v[st], v[mid]);
if (v[st] > v[dr]) swap(v[st], v[dr]);
if (v[mid] > v[dr]) swap(v[mid], v[dr]);
// Pivotul este v[mid], mutăm pivotul la sfârșit pentru a păstra logica partiționării
swap(v[mid], v[dr]);
int piv=v[dr];
int bara=st-1;
for(int i=st;i<dr;i++){
if(v[i]<=piv){
bara++;
swap(v[i],v[bara]);
}
}
swap(v[dr],v[bara+1]);
return bara+1;//noua poz a pivotului
}
int quick_sort(int v[],int st,int dr){
if(st==dr)//daca a mai ramas doar un elem=> ala e
return v[st];
int poz_piv=partitie(v,st,dr);
if(poz_piv==k)//eu incerc sa le sortez pana la poz k
return v[poz_piv];
if(poz_piv>k){//aleg ce sortez in f de poz piv
return quick_sort(v,st,poz_piv-1);
}
else{
return quick_sort(v,poz_piv+1,dr);
}
}
int main()
{
int n;
fin>>n>>k;
for(int i=1;i<=n;i++){
fin>>v[i];
}
int rez= quick_sort(v,1,n);
fout<<rez;
return 0;
}