Cod sursa(job #1994395)

Utilizator clau_rClaudia clau_r Data 24 iunie 2017 20:46:14
Problema Statistici de ordine Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include<iostream>
#include<fstream>
#include<cstdlib>
#include<vector>
#include<time.h>
#include <stdlib.h>

using namespace std;

int get_index(vector<int>&a, int start, int end, int index) {

   for (int i= start; i<= end; i++) {
       if ( i < index && a[i] > a[index] ) {
           std::swap(a[index], a[index+1]);
           std::swap(a[index], a[i]);
           index = index + 1;
       }
       if ( (i < index && a[i] > a[index])||(i > index && a[i] < a[index]) ) {
            std::swap(a[i], a[index]);
            index = i;
        }
       
    }
    return index;    
}

int nth_element(std::vector<int>& a, int start, int end, int k) {
    srand(time(0));
    int index = start + (std::rand() % (end - start + 1));
    index = get_index(a, start, end, index);
    
    if (k == index) {
        return a[index];   
    } else if (k < index) {
        index = nth_element(a, start, index -1, k);    
    } else {
        index = nth_element(a, index + 1, end, k);    
    }

    return std::max(-1, index);
}

int main(){
    ifstream fin;
    fin.open("sdo.in");
    int n, k;
    fin >> n >> k;
    std::vector<int> a;
    a.reserve(n);

    for (int i = 0; i< n;i++) {
        fin >> a[i];
        std::cout << a[i] << "\n";
    }
    
    ofstream fout;
    fout.open("sdo.out");
    fout << nth_element(a, 0, n-1, k-1) << "\n";
   
}