![](https://i-blog.csdnimg.cn/blog_migrate/9455b6dbef5adaa6585c783105982066.png)
![](https://i-blog.csdnimg.cn/blog_migrate/ed102efe658a89b2070df08d4f6dba76.png)
![](https://i-blog.csdnimg.cn/blog_migrate/899da268f0270545f46a03b19263404e.png)
![](https://i-blog.csdnimg.cn/blog_migrate/1375df0998cbdb7efa3bafc552e0e4cd.png)
![](https://i-blog.csdnimg.cn/blog_migrate/5ae790c50886c318c589f1fcb9dff974.png)
![](https://i-blog.csdnimg.cn/blog_migrate/43fc0092796716648ab035e771674263.png)
完整程序:
#include<iostream>
#include<algorithm>
using namespace std;
int a[1024];
//采用分治策略找出第k小元素的算法
//在a[left:right]中选择第k小的元素
int select(int left,int right,int k){
//找到了第k小的元素
if(left>=right)return a[left];
int i=left;//从左到右的指针
int j=right+1;//从右到左的指针
//把最左边的元素作为分界数据
int pivot=a[left];
//把左侧>=pivot的元素与右侧<=pivot额元素交换
while(true){
//在左侧寻找>=pivot的元素
do{
i=i+1;
}while(a[i]<pivot);
//在右侧寻找<=pivot的元素
do{
j=j-1;
}while(a[j]>pivot);
if(i>=j)break;//没有发现交换对象
swap(a[i],a[j]);
}
if(j-left+1==k)return pivot;
a[left]=a[j];//存储pivot
a[j]=pivot;
if(j-left+1<k)
//对一个段进行递归调用
return select(j+1,right,k-j+left-1);
else return select(left,j-1,k);
}
int main()
{
cout<<"请输入数组元素个数和k"<<endl;
int n,k;
cin>>n>>k;
cout<<"请输入数组元素"<<endl;
for(int i=0;i<n;i++){
cin>>a[i];
}
cout<<"第"<<k<<"小的元素是"<<select(0,n-1,k)<<endl;
}