topK 输出最大的K个数

#include<iostream>
#include<algorithm>
#include <string>
#include <vector>
#include<sstream>
using namespace std;

//插入排序 
void InsertSort(int a[], int l, int r) {
	for (int i = l + 1; i <= r; i++) {
		int num = a[i];
		int j = i;
		while (j - 1 >= l && num < a[j - 1]) {
			a[j] = a[j - 1];
			j--;
		}
		a[j] = num;
	}
}

//找key的位置 
int Find(int a[], int l, int r, int key) {
	for (int i = l; i <= r; i++) {
		if (a[i] == key) return i;
	}
}

//BFPRT算法,找中位数的中位数 
int BFPRT(int a[], int l, int r) {
	int k = 0; //有几个中位数 
	int i = l; //指针i用来遍历【l,r】区间
	while (i + 4 <= r) { //够分几个组(5个一组) 
		InsertSort(a, i, i + 4);//用到插入排序 
		k++;
		swap(a[l + k - 1], a[i + 2]);
		i += 5;
	}
	if (i <= r) { //剩下的 
		InsertSort(a, i, r);
		k++;
		swap(a[l + k - 1], a[i + (r - i + 1) / 2]);
	}
	if (k == 1) return a[l];
	else return BFPRT(a, l, l + k - 1);
}

//快速选择算法 
int QSelect(int a[], int l, int r, int K) {
	if (l > r) return 0;
	int i = l;
	int j = r;
	int key = BFPRT(a, l, r); //利用BFPRT算法来产生基数 
	int k = Find(a, l, r, key);  //寻找基数的位置,也可以设置一个全局变量来传递位置
	
	a[k] = a[l];//把每一轮的key放到头部
	
	while (i < j) {
		while (i < j && a[j] >= key) j--;
		a[i] = a[j];
		
		

		while (i < j && a[i] <= key) i++;
		a[j] = a[i];
		
		
	}
	a[i] = key;//i停下来的时候,是和j相碰,也就是等于key在的地方
	if (i + 1 == K) return a[i];//如果i+1是第k大的元素,说明i左右已经分好了 0到k大 和 k到n大
	else if (K < i + 1) 
		return QSelect(a, l, i - 1, K);
	else return QSelect(a,i + 1, r, K);
}
void Qsort(int a[], int l, int r)
{
	if (l > r) 
		return ;
	int i = l;
	int j = r;
	int key = BFPRT(a, l, r); //利用BFPRT算法来产生基数 
	int k = Find(a, l, r, key);  //寻找基数的位置,也可以设置一个全局变量来传递位置
	a[k] = a[l];//把每一轮的key放到头部
	while (i < j) {
		while (i < j && a[j] >= key) j--;
		a[i] = a[j];
		while (i < j && a[i] <= key) i++;
		a[j] = a[i];
	}
	a[i] = key;
	Qsort(a, l, i - 1);
	Qsort(a, i+1, r);
}
int main() {
	string s;
	string temp;
	getline(cin, s);
	vector<int> vec;
	int tempInt;
	for(auto &c:s)
	{
		if (c >= '0' && c <= '9')
			temp += c;
		else
		{
			if(!temp.empty())
			{
				istringstream is(temp);
				is >> tempInt;
				vec.push_back(tempInt);
				temp.clear();
			}
			
		}
	}
	
	int* a;
	a = new int[vec.size()];
	for(int i=0;i<vec.size();++i)
	{
		a[i] = vec[i];
	}
	
	int n = vec.size();
	int k;
	cin >> k;
	QSelect(a, 0, n - 1, k);
	Qsort(a, n - k, n - 1);
	for (int i = n-1; i >= n-k; --i)
	{
		cout << a[i];
		if (i != n - k)
			cout << " ";
	}
		
	
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值