快速排序与线性时间找第k大数字(POJ2388)

本文介绍了如何使用快速排序的原理来寻找第k大的数字,并探讨了在最坏情况下的时间复杂度。同时,提出了线性时间复杂度的查找方法,通过实例题目HDU1425解释了这一方法的应用。此外,还提到了寻找中位数的问题,即找到使得至少一半的元素大于等于或小于等于它的数值的元素。
摘要由CSDN通过智能技术生成

一开始我真没把这种大一就要看的东西当回事,直到我自己听完课写了一遍,改了一晚上错。

还是有很多地方要注意的,就像书上那么多错误二分,都是尝试得到的。

#include<bits/stdc++.h>
using namespace std;
void Swap(int &a,int &b)
{
	int tep=a;
	a=b;
	b=tep;
}
void Quicksort(int a[],int l,int r)
{
	if(l>=r)
		return ;
	int select=rand()%(r-l+1)+l;
	int t=a[select];
	Swap(a[select],a[l]);//将随机选择的比较数字放在最前面,因为那个位置实际上是空的,放在里面相
                         //当于又加上去一个比较数字
	int i=l,j=r+1;
	while(i<j)
	{
		while(a[++i]<=t && i<=r);//这里while里的a[]<=t可以改成<
                                  //<=实际上是缩小了范围,减少了重复数字交换
                                 //但后面的j为了保证能找到第一个小于等于比较数字的数字,不能加=
		while(a[--j]>t && j>=l);
		if(i<j)
			Swap(a[i],a[j]);
	}
	a[l]=a[j];//将比较数字与最后一个小于等于比较数字的交换
	a[j]=t;//中间的即为比较数字自己
	Quicksort(a,l,j-1);
	Quicksort(a,j+1,r);
}
int main()
{
	int a[10]={1,5,7,-2,-4,3,0};
	Quicksort(a,0,6);
	for(int i=0;i<=6;i++)
		printf("%d%s",a[i],i==6?"\n":" ");
	return 0;
}

下面是例题,用于检测程序,HDU1425

sort

Time Limit: 6000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 60315    Accepted Submission(s): 16645

Problem Description

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值