Pagini recente » Cod sursa (job #702648) | Cod sursa (job #1746566) | Cod sursa (job #1285688) | Cod sursa (job #1407072) | Cod sursa (job #2083147)
#include<bits/stdc++.h>
using namespace std;
ifstream f("sdo.in");
ofstream g("sdo.out");
int n,k;
vector<long long>v(n+1);
int mediana (int i, int j,int k){
if(((v[i]>=v[j])&&(v[i]<=v[k]))||((v[i]<=v[j])&&(v[i]>=v[k])))return i;
if(((v[j]>=v[i])&&(v[j]<=v[k]))||((v[j]<=v[i])&&(v[j]>=v[k])))return j;
else return k;
}
int quicksort(int s,int d,int poz){
if (s==d) return v[s];
//pivot generat random, fiind medianul dintre 3 pivoturi random
int p1,p2,p3;
p1=rand()%(d-s+1) +s;
p2=rand()%(d-s+1) +s;
p3=rand()%(d-s+1) +s;
int poz_pivot=mediana(p1,p2,p3);
long long pivot=v[poz_pivot];
//impartim vectorul in doua in functie de pivot
int i=s-1,j=d+1;
while(i<j){
while(v[++i]<pivot);
while(v[--j]>pivot);
if(i>=j)
poz_pivot=j;
else
swap(v[i],v[j]);
}
//apelam recursiv functia pana cand vectorul e sortat
if(poz+s-1<=poz_pivot)
return quicksort(s,poz_pivot,poz);
else
return quicksort(poz_pivot+1,d, poz-poz_pivot+s-1);
}
int main(){
srand(time(NULL));//pentru qsort
f>>n>>k;
for(int i=1;i<=n;++i)
f>>v[i];
g<<quicksort(1,n,k);
return 0;
}