分治 001:输出前k大的数

本文介绍了一种通过分治策略来解决找出数组中前k大数的问题,避免了对整个数组进行排序的时间消耗。具体方法是利用快速排序的思想,将前k大的数移动到数组的右侧并进行排序,从而实现高效地输出前k大数的目标。
摘要由CSDN通过智能技术生成

001:输出前k大的数

总时间限制: 10000ms 单个测试点时间限制: 1000ms 内存限制: 65536kB
描述
给定一个数组,统计前k大的数并且把这k个数从大到小输出。

输入
第一行包含一个整数n,表示数组的大小。n < 100000。
第二行包含n个整数,表示数组的元素,整数之间以一个空格分开。每个整数的绝对值不超过100000000。
第三行包含一个整数k。k < n。
输出
从大到小输出前k大的数,每个数一行。
样例输入

10
4 5 6 9 8 7 1 2 3 0
5

样例输出

9
8
7
6
5

解法
若排序整个列表,浪费很多资源;
故可把前m大的数放在数组右边排序,再输出
将前m大的移到右边
快排方法,将a[0]放到a[i],若i=n-m+1,则该数左标比自身小,右边比自身大,排序该数右边即可;
若i<n-m+1,则继续查找i右边,直到找到i=n-m+1为止;
若i>n-m+1,则查找左边;

#include<iostream>
using namespace std;
void swap(int &a,int &b){
   
	int temp=a;
	a=b;
	b=temp;
}
//交换函数
void QuickSort(int a[],int s,int e)     //快速排序
{
   
	if(s&
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值