Cod sursa(job #1821928)

Utilizator mdiannnaMarusic Diana mdiannna Data 3 decembrie 2016 21:46:13
Problema Statistici de ordine Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
//Quicksort randomizat merge 100p
#include <iostream>
#include <stdlib.h>
#include <time.h>
#include <stdio.h>

using namespace std;

int N, k;
int A[3000001];

void citire(){
    scanf("%d %d", &N, &k);
    for(int i=1; i<=N; i++)
        scanf("%d", &(A[i]));
}

void afisare(){
    for(int i=1; i<=N; i++)
        printf("%d ", A[i]);
    printf("\n");
}


int random(int left, int right){
    return rand() % (right-left+1) + left;
}

int Partition(int left, int right){
    //int p = (left+right)/2;

    int p = random(left, right);

    //cout << "p=" << p << endl;
    int x = A[p];
    int iLeft = left;
    int iRight = right;
    do{
        while(A[iLeft]<x)
            iLeft++;
        while(A[iRight]>x)
            iRight--;
        if(iLeft<=iRight){
            swap(A[iLeft], A[iRight]);
            iLeft++;
            iRight--;
        }

    }while (iLeft<=iRight);

    return iLeft-1;
}

void QuickSort(int left, int right){
    if(right<=left)
        return;
    int q = Partition(left, right);
    if(k == q){
        cout << A[q];
        return;
    }
    else
        if(k<q)
            QuickSort(left, q);
        else
            QuickSort(q+1, right);
}

int main(){
     freopen("sdo.in", "r", stdin);
    freopen("sdo.out", "w", stdout);

    srand(time(NULL));
    citire();
    if(N == 1)
        cout << A[1];
     else
        QuickSort(1, N);
   // afisare();

    return 0;
}