查找第K大的数
Posted draymonder
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了查找第K大的数相关的知识,希望对你有一定的参考价值。
类快排 第一种方法 o(n)
#include <bits/stdc++.h>
using namespace std;
const int N = 1000;
int s[N];
int partion(int l,int r) {
int tmp = s[l];
int i = l, j = r;
while(i < j) {
while(i < j && s[j] >= tmp) j--;
while(i < j && s[i] <= tmp) i++;
if(i < j) {
swap(s[i], s[j]);
}
}
// now i == j
swap(s[i], tmp);
return i;
}
void selectKth(int l,int r,int k) {
if(l > r)
return ;
int c = partion(l,r);
if(c == k)
return ;
else if(c < k)
selectKth(c+1,r,k);
else
selectKth(l,c,k);
}
int main()
{
srand(time(NULL));
int n = 10;
int m = 10;
for(int i=1; i<=n; i++)
s[i] = rand() % 15;
int k = 5;
selectKth(1,n,k);
printf("%d
", s[k]);
sort(s+1,s+11);
printf("%d
", s[k]);
return 0;
}
第二种方法 用到堆了
大根堆 是arr[i] <= arr[2*i+1] && arr[i] <= arr[2*i], 因此大根堆的堆顶是最小值,所以排序的话呢,就是从小到大排的...
priority_queue<int> que;
int k = 5;
for(int i=1; i<=n; i++) {
que.push(s[i]);
if(que.size() > k) {
que.pop();
}
}
cout<<que.top()<<endl;
以上是关于查找第K大的数的主要内容,如果未能解决你的问题,请参考以下文章
给定两个数组,这两个数组是排序好的,让你求这两个数组合到一起之后第K大的数。
剑指offer-找到第k大的数,找到数组中个数超过一半的数,找到数组中最小的k个数。