问题描述:设计一个O(n)时间的算法,对于一个给定的包含n个不同元素的集合S和一个正整数K<=n,该算法可以确定S中最接近中位数的K个数。(当n为偶数时中位数为较小中位数)
问题分析,我们前面已知Select算法求n个数集合中第k大的数算法复杂度为O(n),解决此问题可以分为以下几步:
1.求出中位数x(可以利用Select函数求集合中第(n+1)/2小的数就是中位数。
2.用x减去集合中的每个数得到差的绝对值储存在数组b[n]中
3.求b[n]中第k小的数d
4.遍历原来集合,输出集合中数据与x差的绝对值<=d的数
注意结果中输出的数可能大于k个
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
void Select_K_Numbers(int *a, int n,int k);
int main(){
/*测试*/
int const n = 9;
const int k = 3;
int a[n] = { 8, 4,1, -89, -12,