给出一组数字,数字个数为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; } 12345678910111213141516171819202122 12345678910111213141516171819202122解法二:遍历K次 代码就不写了,时间复杂度O(n*k)。
解法三:对原数组建立最大堆
解法四:维护最小堆 维护一个k大小的最小堆,对于数组中的每一个元素判断与堆顶的大小,若堆顶较大,则不管,否则,弹出堆顶,将当前值插入到堆中。时间复杂度O(n * logk)。
解法五:Hash 利用hash保存数组中元素Si出现的次数,利用计数排序的思想,线性从大到小扫描过程中,前面有k-1个数则为第k大数,平均情况下时间复杂度O(n)。