找中位数 c语言 递归,分治与递归-找k个临近中位数的数

问题描述:给定由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;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值