codeup 5067 求第k大数 (犯错太多)

本文深入探讨了一种改进的快速选择算法实现,通过随机选取基准元素进行划分,有效地解决了传统快速排序算法在最坏情况下的性能问题。文章详细解释了算法流程,包括随机化基准选择、元素比较和交换过程,以及如何递归地找到第K大的元素。通过对错误代码的分析,揭示了在实际应用中可能出现的问题,如忽略特定条件下的元素处理、逻辑判断错误等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <cstdio>
#include <cstdlib>
#include <ctime>

const int maxN = 1000010;
int n,k;
int datas[maxN];
int tools[maxN];

int getSite_divide(int l,int r)
{
	int site = rand()%(r-l+1) + l;
	int temp = datas[site];
	int ti = l,tj = r;
	for(int i = l;i <= r;i++){							//error 没用i++,相当于忽略了 ddatas[i] == temp 的情况 
		if(datas[i] > temp)	tools[ti++] = datas[i];		//error 没用if,用了while,并用的是i++而非i,可能多+ 
		if(datas[i] < temp)	tools[tj--] = datas[i];		//error 没用if,用了while 
	}
	
	for(int i = 0;i <= r;i++){
		if(i < ti)			datas[i] = tools[i];
		else if(i <= tj){	
			datas[i] = temp;
			site = i; 									//error:没改site 
		} 
		else				datas[i] = tools[i];
	}
	return site;										//error:没改site 返回划分之后temp元素所在的位置。 
}

//在[l,r]中找第 K 大的元素。 
int find_k(int l,int r,int K)
{
	//设置出口: 
	if(l >= r)	return datas[l];						//l >= r 时一定 M == K 
	
	//随机定一个元素作为目标元素,比较其与 k 的位置。
	int m = getSite_divide(l,r);
	int M = m - l + 1;
	if(M == K)		return datas[m];
	else if(M < K)	find_k(m+1,r,K-M);					//error 没有用 K-M,里面的逻辑关系自己想 
	else			find_k(l,m-1,K);
}

int main()
{
	//读入数据 + init
	scanf("%d %d",&n,&k);
	for(int i = 0;i < n;i++)	scanf("%d",&datas[i]);
	srand((unsigned)time(NULL));
	
	
	//找出目标元素
	int show = find_k(0,n-1,k);
	
	//输出:
	printf("%d",show);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Drdajie

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值