线性时间选择算法
- 模仿快速排序算法
- 对数组使用分治策略
例题一
问题描述
对于给定的n个元素的数组a[0:n—1],要求从中找出第k小的元素
输入:输入有多组测试例。
对每一个测试例有2行
第一行是整数n和k(1≤k<n≤1000)
第二行是n个整数
输出:第k小的元素
问题分析
我们知道,快速排序算法的一次排序的思想是:
找到一个数字作为标准,把比该数小的放左边,比该数大的放右边
要找到第k小的元素,最粗暴的就是全部排序,但这样做了很多多余的工作,借鉴快速排序算法的一次排序思想,我们可以以数组首位元素作为一个标准,把小于它的放左边,大于它的放右边:
- 当这个标准左边的元素和它加起来为k的话,就找到第k小的数了
- 当这个标准左边的元素和它加起来小于k的话,就向右边继续找第(k-1-该数下标)小的数
- 当这个标准左边的元素和它加起来大于k的话,就向左边继续找第k小的数
算法实现
#include <iostream>
#include <algorithm>
#define N 100
using namespace std;
//一维数组容器
int a[N];
//线性选择算法寻找第k小的元素
int linearTimeSelection(int,int,int);
int main()
{
int n,k;
cout<<"输入数组大小:";
cin>>n;
if(n>N || n<1) {
cout<<"预留空间不足或数组大小非法!";
exit(0);
}
cout<<"输入数组元素:";
for(int i=0;i<n;i++) cin>>a[i];
cout<<"查找第几小的元素:";
cin>>k;
if(k > n || k < 1){
cout