Pagini recente » Cod sursa (job #2443731) | Cod sursa (job #1899185) | Cod sursa (job #1560071) | Cod sursa (job #2564164) | Cod sursa (job #3327456)
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
/*
param:
int v[] - vectorul pe care vrei sa il prelucrezi
int n - nr de elemente din vector
int pivot - pivotul
return:
int p - pozitia pivotului in vectorul sortat
*/
int partition(int seg[],int p1,int p2,int pivot){
int aux;
while(seg[p1]<pivot){
p1++;
}
while(seg[p2]>pivot){
p2--;
}
while(p1<p2){
//stim ca p1<p2 si vom fi pe indicii buni => swap
aux=seg[p1];
seg[p1]=seg[p2];
seg[p2]=aux;
//caut un element mai mare ca pivotul in stanga lui
do{
p1++;
}while(seg[p1]<pivot);
//caut un element mai mic ca pivotul in dreapta lui
do{
p2--;
}while(seg[p2]>pivot);
}
return p2;
}
/*
param:
int v[] - vectorul pe care vrei sa il prelucrezi
int st - primul element din vecotrul nou
int dr - ultimul element din vecotrul nou
return:
int v[k] - elementul de pe pozitia k din vectorul sortat
*/
int quickSelect(int seg[],int st,int dr,int k){
int si;
while(st<dr){
si=partition(seg,st,dr,seg[(st+dr)/2]);
//avem de la st la si elemente mai mici sau egale ca pivotul
//avem de la e+1 la dr elemente mai mari sau egale cu pivotul
if(k<=si){
dr=si;
}else{
st=si+1;
}
}
return seg[k];//acum k v-a fi pe pozitia buna :)
}
#define MAXN 1000000
int v[MAXN];
int main(){
FILE *fin,*fout;
int n,i,k;
char ch;
fin=fopen("sdo.in","r");
fscanf(fin,"%d%d ",&n,&k);
for(i=0;i<n;i++){
ch=fgetc(fin);
while(isdigit(ch)){
v[i]=v[i]*10+ch-'0';
ch=fgetc(fin);
}
}
fclose(fin);
fout=fopen("sdo.out","w");
fprintf(fout,"%d",quickSelect(v,0,n-1,k-1));
fclose(fout);
return 0;
}
/*
1 3 7 2 5 4 3
1 2 3 3 4 5 7
*/