给出一组数字,数字个数为N,找到其中第K大的数字。(N>= K)
int a[maxn]中maxn=32768*1024/4;
解法一:读入所有数据,用快速排序
时间复杂度O(N+N*logN)
#include <cstdio>
#include <algorithm>
#define maxn 1000000+5
using namespace std;
int T[maxn];
bool cmp(int a,int b)
{
return a>b;
}
int main()
{
int N,K;
scanf("%d %d",&N,&K);
for(int i=0;i<N;i++)
scanf("%d",&T[i]);
sort(T,T+N,cmp);
printf("%d\n",T[K-1]);
return 0;
}
解法二:遍历K次
代码就不写了,时间复杂度O(n*k)。
解法三:对原数组建立最大堆
解法四:维护最小堆
维护一个k大小的最小堆,对于数组中的每一个元素判断与堆顶的大小,若堆顶较大,则不管,否则,弹出堆顶,将当前值插入到堆中。时间复杂度O(n * logk)。
解法五:Hash
利用hash保存数组中元素Si出现的次数,利用计数排序的思想,线性从大到小扫描过程中,前面有k-1个数则为第k大数,平均情况下时间复杂度O(n)。