Cod sursa(job #1733491)

Utilizator RRomaniucRomaniuc Radu Andrei RRomaniuc Data 24 iulie 2016 19:36:03
Problema Statistici de ordine Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include <stdio.h>
#include <algorithm>
#include <cstdlib>
#define MAXN 3000001
FILE *inputFile = fopen("sdo.in", "r"), *outputFile = fopen("sdo.out", "w");
int numbers[MAXN];
int n, sdo, i, nr;
int partition(int first, int last)
{
    int k = first - 1, i, pivot = numbers[last];
    
    for(i = first; i < last; i++)
        if(numbers[i] <= pivot)
        {
            k++;
            std::swap(numbers[i], numbers[k]);
        }
    
    std::swap(numbers[last], numbers[k + 1]);
    
    return k + 1;
}
int randomized_partition(int first, int last)
{
    int random =  first + (rand() % (int)(last - first + 1));
    std::swap(numbers[last], numbers[random]);
    return partition(first, last);
}
void quicksort(int first, int last)
{
    if(first < last)
    {
        int q = randomized_partition(first,last);
        quicksort(first, q - 1);
        quicksort(q + 1, last);
    }
}
int randomized_select(int first, int last)
{
    if(first == last) return numbers[first];
    
    int q = randomized_partition(first, last);
    
    if (q == sdo) return numbers[q];
    
    if (sdo < q) return randomized_select(first, q - 1);
    else return randomized_select(q + 1, last);
    
    return -1;
}
int main()
{
    fscanf(inputFile, "%d %d", &n ,&sdo); sdo--;
    
    for(i = 0; i < n; i++)
        fscanf(inputFile, "%d", numbers + i);
    
    //quicksort(0, n - 1);
    
    fprintf(outputFile, "%d", randomized_select(0, n - 1));
    
    return 0;
}