Cod sursa(job #1029102)

Utilizator sziliMandici Szilard szili Data 15 noiembrie 2013 00:14:13
Problema Statistici de ordine Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 2.16 kb
#include <iostream>
#include <stdio.h>
#include <stdlib.h>

using namespace std;

int a[3000001];


void insertionSort(int left, int right){

    int current;
    for (int i= left+1; i<=right; i++){
        current = a[i];
        int j = i-1;

        while (j >= left && a[j]>current){
            a[j+1] = a[j];
            j--;
        }

        a[j+1] = current;
    }

}

int partitionArray(int start, int endd, int pivotIndex){
    int currentIndex = start;
    int swapp;

    swapp = a[pivotIndex];
    a[pivotIndex] = a[endd];
    a[endd] = swapp;

    for (int i=start+1; i<endd; i++){

        if (a[i] <= a[endd]){
            swapp = a[i];
            a[i] = a[currentIndex];
            a[currentIndex] = swapp;

            currentIndex++;
        }
    }

    swapp = a[endd];
    a[endd] = a[currentIndex];
    a[currentIndex] = swapp;

    return currentIndex;
}

int select(int start, int endd, int k){
    if (endd - start <= 10){
        insertionSort(start, endd);

        return (start + k-1);
    }

    int swapp;
    int currentIndex = start;

    for (int i=0; i< (endd-start+1)/5; i++){
        insertionSort(start + i*5, start + (i+1)*5 -1);

        swapp = a[currentIndex];
        a[currentIndex] = a[start + (i*5) + 2];
        a[start + (i*5) + 2] = swapp;

        currentIndex++;
    }

    int mIndex = select(start, currentIndex-1, (currentIndex-start)/2);

    int partitionIndex = partitionArray(start, endd, mIndex);
    int startIndex = partitionIndex;

    while ((startIndex>start) && a[startIndex-1] == a[startIndex]){
        startIndex--;
    }

    if (k < startIndex){
        return select(start, startIndex-1, k);
    }
    else if (k > partitionIndex){
        return select(partitionIndex+1, endd, k - (partitionIndex-start+1));
    } else {
        return mIndex;
    }
}


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

    int n,k;

    scanf("%d %d", &n, &k);

    for (int i=0; i<n; i++){
        scanf("%d", &a[i]);
    }

    int kth = select(0, n-1, k);

    printf("%d", a[kth]);

    return 0;
}