寻找序列中第 K 小元素(分治法)C++

一、实验目的
掌握分治法的基本思想
二、实验内容
实现一个从数组中寻找第 K 小元素算法。
三、算法描述
对于此题目,利用分治法的思想,将复杂的问题变为多个类似的
小问题。该代码中定义一个函数在指定区间中寻找,当区间中至少有
两个元素时,我们需要定义一个基数,从前面和后面开始,将数组分
为两个区域,左边为比基数小的,右边为比基数小的。令 a[i] 等于基
数,所求的第 k 小在数组中的下标为 k-1 。所以当 k-1=i 时返回 a[i]
的值;若 k-1<i ,在左区间递归查找;若 k-1>i 时,在右区间递归查
找。当区间中只有一个元素时,直接返回 a[k-1]
四、实验要求
本实验要求实现以下功能:
(1) 输入一个乱序的数组和 k 值。
(2) 从数组中寻找第 k 小元素。
五、实验代码
#include<iostream>
using namespace std;
int QS(int a[],int s,int t,int k)	
{
	int i=s,j=t;
	int tmp;	//基数 
	if(s<t)	//【1】区间至少两个元素 
	{
		tmp=a[s];
		while(i!=j)
		{
			while(j>i&&a[j]>=tmp)j--;
			a[i]=a[j];
			while(i<j&&a[i]<=tmp)i++;
			a[j]=a[i];
		}
		a[i]=tmp;
		if(k-1==i)return a[i];	//【2】 
		else if(k-1<i)return QS(a,s,i-1,k);	//【2】左区间递归查找 比基准小 
		else return QS(a,i+1,t,k);	//【2】右区间递归查找 
	}
	else if(s==t&&s==k-1)return a[k-1];	//【1】区间只有一个元素 
} 
int main()
{
	int n=8;
	int k;
	cin>>k;
	int a[]={2,3,1,4,5,7,8,6};
	k=QS(a,0,n-1,k);
	cout<<"NO."<<k<<":"<<k<<endl;
	return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值