Cod sursa(job #3327456)

Utilizator Andrei_PanaAndrei Pana Andrei_Pana Data 3 decembrie 2025 23:04:43
Problema Statistici de ordine Scor 50
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.8 kb
#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
*/