一、实验目的
掌握分治法的基本思想
二、实验内容
实现一个从数组中寻找第
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;
}