Cod sursa(job #1029187)

Utilizator sziliMandici Szilard szili Data 15 noiembrie 2013 09:15:42
Problema Statistici de ordine Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.36 kb
#include <iostream>
#include <stdio.h>
#include <stdlib.h>

using namespace std;

int a[3000001];
  int n,k;

void insertionSort(int *a, int sizee){

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

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

        a[j+1] = current;
    }

}

int partitionArray(int *a, int sizee, int pivot){
    int currentIndex = 0;
    int swapp;

    for (int i=0; i<sizee; i++){

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

            currentIndex++;
        }
    }

    for (int i=currentIndex; i<sizee; i++){
        if (a[i] == pivot){
            swapp = a[currentIndex];
            a[currentIndex] = a[i];
            a[i] = swapp;
            currentIndex++;
        }
    }


    return currentIndex-1;
}

void print(int start, int endd){

    for (int i=start; i<=endd; i++){
        printf("%d ", a[i]);
    }

    printf("\n");
}

int select(int *a, int sizee, int k){
    if (sizee <= 10){
        insertionSort(a, sizee);

        return a[k-1];
    }

    int swapp;
    int currentIndex = 0;

    for (int i=0; i< sizee/5; i++){
        insertionSort(a + i*5, 5);

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

        currentIndex++;
    }

    int m = select(a, currentIndex, sizee/10);

    int partitionIndex = partitionArray(a, sizee, m);

    int ySize=0;// = partitionIndex - startIndex +1;
    int xSize=0;// = startIndex- start;
    int zSize=0;// = endd-partitionIndex;

    for (int i=0; i< sizee; i++){
        if (a[i] < m){
            xSize++;
        }else if (a[i]>m){
            zSize++;
        } else {
            ySize++;
        }
    }

    if (k <= xSize){
        return select(a, xSize, k);
    }
    else if (k > xSize+ySize){
        return select(a+xSize+ySize, zSize, k - (xSize+ySize));
    } else {
        return m;
    }
}


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

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

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

    int kth = select(a, n, k);

    printf("%d", kth);

    return 0;
}