问题描述:给定由n个互不相同的数组成的集合s以及正整数k≤n,试设计一个o(n)时间算法找出s中最接近s的中位数的k个数。
算法描述:
用线性时间选择实现的算法找到中位数
s’=除去中位数外的s
s"=|s'中的数值-中位数的值|
用线性时间选择实现的算法找到第k个最小的数
输出s”中小于第k个最小的数的数对应的s中的值
算法实现:
selectorder函数、partition函数、sord函数同线性时间选择程序的算法实现,故略。
int main()
{
void sord(int a[],int h,int t);
int selectorder(int x,int a[],int h,int t);
int partition(int a[],int h,int t,int k);
int n;
scanf("%d",&n);
int *a;
a=(int *)malloc(sizeof(int)*n);
for(int i=0;i
a[i]=rand();
for(int i=0;i
printf("%d ",a[i]);
//动态分配数组a
//随机生成数组a元素、输出
/*
int n=7;
int a[7]={0,-1,20,-4,-100,2000,2001};
for(int i=0;i
printf("%d ",a[i]);
*/
printf("\n");
int middle;
middle=selectorder((n-1)/2,a,0,n-1);
printf("%d\n",middle);
//找到数组a中的中位数并赋值给middle
int *b;
b=(int *)malloc(sizeof(int)*n);
for(int i=0;i
if(a[i]>=middle)b[i]=a[i]-middle;
else b[i]=middle-a[i];
//动态分配数组b
//数组b中元素=|数组a中元素-middle|
int *c;
c=(int *)malloc(sizeof(int)*n);
for(int i=0;i
//数组c中元素=数组b中元素
int k;
scanf("%d",&k);
//输入k
int last;
last=selectorder(k-1,b,0,n-1);
//找到数组b中第k小元素并赋值给last
for(int i=0;i
if(c[i]<=last)printf("%d ",a[i]);
//遍历数组c,如果数组c中元素小于last,
//则输出对应位置上数组a的元素
printf("\n");
sord(a,0,n-1);
for(int i=0;i
return 0;
}