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