Problem B: The K-th largest number
Time Limit: 2 Sec Memory Limit: 40 MBSubmit: 856 Solved: 233
[ Submit][ Status][ Web Board]
Description
Given N integer numbers, find the K-th largest number.
Requirement: design an algorithm with the time complexity O(NlogK).
Input
The first line contains N, K. In the following N lines, each line contains an integer value.
Note that N could be very large ( 1000000 <= N <= 10000000). You should allocate the memory dynamically and design the algorithm with the time complexity O(NlogK).
Output
Sample Input
12 4
7
2
1
5
6
6
4
3
8
8
10
9
Sample Output
8
HINT
If the memory is not enough, you may apply a sliding window to split the batchs of input and sort in each batch.
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
void qsort2(int* a, int l, int r, int rank) {
int m;
if (l < r) {
m = partition2(a, l, r);
}
if (r - m + 1 == rank) return;
else if (r - m + 1 > rank) qsort2(a, m + 1, r, rank);
else qsort2(a, l, m - 1, rank - (r - m + 1));
}
int partition2(int* a, int l, int r) {
int i = l;
int j = r;
int pivot = a[l];
while (i < j) {
while ((a[j] >= pivot) & (i < j)) --j;
a[i] = a[j];
while ((a[i] <= pivot) & (i < j)) ++i;
a[j] = a[i];
}
return j;
}
int main() {
srand(time(NULL));
int n, rank;
scanf("%d %d", &n, &rank);
int* a = (int*) malloc(n * sizeof(int));
for (int i = 0; i != n; ++i) {
scanf("%d", a + i);
}
qsort2(a, 0, n - 1, rank);
printf("%d\n", a[n - rank]);
return 0;
}