Cod sursa(job #2619539)

Utilizator ADRIAN.CATRINOIUAdrian Catrinoiu ADRIAN.CATRINOIU Data 27 mai 2020 21:48:45
Problema Statistici de ordine Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.28 kb
#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;
}