9.3 最坏情况下线性时间选择

#include<iostream>
#include<cstdlib>
#include<ctime>

#define MAX_VALUE 10000
#define random() rand()%MAX_VALUE
#define N 10000

using namespace std;

int a[N];

class Find
{
public:
	void bubble(int first, int last)			//冒泡排序
	{
		for(int flag=first; flag<last; flag++)
		{
			for(int i=last; i<flag; i--)
			{
				if(a[i-1]<a[i])
				{
					int temp=a[i];
					a[i]=a[i-1];
					a[i-1]=temp;
				}
			}
		}
	}

	int partition(int p, int r, int x)			//以数值x对数组进行分割
	{
		int i, j;
		for(i=p,j=r; i<j; i++)
		{
			if(a[i]>x)
			{
				while(i<j && a[j]>x)
					j--;
				if(i!=j)
				{
					int temp=a[i];
					a[i]=a[j];
					a[j]=temp;
					j--;
				}
			}
		}
		return i-1;                                  //i多自加了一次
	}

	int select(int p, int r, int k)				//第k小的元素
	{
		if(r-p<5)
		{
			bubble(p,r);
			return a[p-1+k];
		}

		for(int i=0; i<(r-p-4)/5; i++)
		{
			int s=p+5*i, t=s+4;
			bubble(s,t);
			int temp=a[p+i];			//把所有中位数都移到数组前面
			a[p+i]=a[s+2];
			a[s+2]=temp;
		}

		int x=select(p, p+(r-p-4)/5, (r-p+6)/10);	
		//计算已经得到的一组中位数的中位数,即第(((r-p-4)/5)/2+1)小的数(根据约定,有偶数个中位数的话取下中位数)

		int i=partition(p,r,x);
		int j=i-p+1;
		if(j=k)
			return a[i];
		else if(j<k)
			return select(p,i,k);
		else
			return select(i+1,r,k-j);
	}
};

void main()
{
	srand((int)time(NULL));
	for(int i=0; i<N; i++)
	{
		a[i]=random();
		cout<<a[i]<<"\t";
	}
	cout<<endl;

	Find f;
	int n=5000;
	cout<<"The No."<<n<<" is:"<<f.select(0,N-1,n)<<endl;
}

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值