问题 A: 求第k大数
时间限制: 1 Sec 内存限制: 128 MB题目描述
求第k大的数
(Kth.pas/c/cpp)
给定一个长度为n(1≤n≤1,000,000)的无序正整数序列,以及另一个数k(1≤k≤1,000,000)(关于第k大的数:例如序列{1,2,3,4,5,6}中第3大的数是4。)
输入
第一行两个正整数m,n。
第二行为n个正整数。
输出
第k大的数。
样例输入
6 3
1 2 3 4 5 6
样例输出
4
User: 吴锦诚
Date: 2018/6/12
#include <iostream>
#include <algorithm>
#include <math.h>
#include <string.h>
using
namespace
std;
int
an[1000000];
int
randPartiton(
int
an[],
int
left,
int
right) {
int
p = round(1.0*
rand
() / RAND_MAX * (right - left) + left);
swap(an[p], an[left]);
int
temp = an[left];
while
(left< right) {
while
(left < right &&an[right]<=temp)right--;
an[left] = an[right];
while
(left <right &&an[left] >temp) left++;
an[right] = an[left];
}
an[left] = temp;
return
left;
}
void
select(
int
an[],
int
left,
int
right,
int
k) {
if
(left > right)
return
;
int
index = randPartiton(an, left, right);
int
temp = index - left + 1;
if
(temp == k) {
cout << an[index] << endl;
return
;
}
if
(temp < k) {
select(an, index + 1, right, k-temp);
}
else
{
select(an, left, index - 1, k);
}
}
int
main()
{
int
i, n, k;
while
(cin >> n) {
memset
(an, 0,
sizeof
(an));
cin >> k;
for
(i = 0; i < n; i++) {
cin >> an[i];
}
select(an, 0, n - 1, k);
}
return
0;
}
/**************************************************************
Problem: 5067
User: morizunzhu
Language: C++
Result: 正确
Time:0 ms
Memory:5924 kb
****************************************************************/