Pagini recente » Cod sursa (job #542527) | Cod sursa (job #1608949) | Cod sursa (job #2145828) | Cod sursa (job #1213274) | Cod sursa (job #1029102)
#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;
}