Pagini recente » Cod sursa (job #773343) | Cod sursa (job #903871) | Cod sursa (job #993704) | Cod sursa (job #1033195) | Cod sursa (job #1029187)
#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;
}