问题描述:设计一个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[

设计一个O(n)时间复杂度的算法,针对包含n个不同元素的集合S和正整数K<=n,找出S中最接近中位数的K个数。算法步骤包括计算中位数、存储差值绝对值、找到差值的第k小数,最后输出符合条件的元素。
最低0.47元/天 解锁文章
6894

被折叠的 条评论
为什么被折叠?



