读书人

中科院考研题目解决办法

发布时间: 2012-02-11 09:51:35 作者: rapoo

中科院考研题目
在一个数组中求最大值与最小值,要求 辅助空间 O(1),最坏情况下比较次数 3n/2,n
为数组员素数

[解决办法]
数据成员前两个存放最大值, 最小值
然后逐个比较, 最坏情况下比较次数是 3n/2

辅助空间O(1), 需要自己写个数字交换函数, 用加法,位操作... 都可以
[解决办法]
编程爱好者,专业人士,在这里您可以和更多的同行交流,我们的宗旨是:平等互利,共同进步,努力将群建设成为一个具有完善体系,
管理严谨的讨论专区。有意者请加入qq群:9494256 【设计之源】(主)
或者访问群官方论坛:http://mcbbs.uu1001.com/

[解决办法]
楼上的方法最坏情况比较次数会达到2n-3的。

现在我能想到的分治法几乎能达到3n/2,但是还不能严格少于3n/2,要多做几次比较。
[解决办法]
这个方法可以:

#include <stdio.h>

int main()
{
int nums[]={3,1,4,1,5,9,2,6};
int max=nums[0];
int min=nums[0];
int size=sizeof(nums)/sizeof(nums[0]);
int a,b;
int i;
for (i=1; i <size; i+=2)
{
if (i <size-1)
{
if (nums[i]> nums[i+1])
{
a=nums[i];
b=nums[i+1];
}
else
{
a=nums[i+1];
b=nums[i];
}
if (max <a) max=a;
if (min> b) min=b;
}
else
{
if (max <nums[i]) max=nums[i];
if (min> nums[i]) min=nums[i];
}
}
printf( "max:%d min:%d\n ", max, min);
}

循环n/2次,每次最多作3次比较,所以总次数不超过3n/2。

读书人网 >C语言

热点推荐