免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234
最近访问板块 发新帖
楼主: kf701
打印 上一主题 下一主题

一组数中找max或min的最快方法是什么? [复制链接]

论坛徽章:
0
31 [报告]
发表于 2007-04-09 19:48 |只看该作者
原帖由 emacsnw 于 4/9/07 16:25 发表


这个应该是最好的方法了,记得以前哪里看到过。


好像是算法导论里有吧?
但是仍然不知道它是不是最好...

论坛徽章:
0
32 [报告]
发表于 2007-04-09 20:03 |只看该作者
最好的方法就是ArXoR 说的分治法


  1. void MinMax(int a[], int n, int &min, int &max)
  2. {
  3.     int s;
  4.     if(n % 2)
  5.     {
  6.         min = max = a[0];
  7.                 s = 1;
  8.     }
  9.     else
  10.         {
  11.                 if (a[0] > a[1])
  12.                 {
  13.                         min = a[1];
  14.                         max = a[0];
  15.                 }

  16.                 else
  17.                 {
  18.                         min = a[0];
  19.                         max = a[1];
  20.                 }
  21.                 s = 2;
  22.         }

  23.         for (int i = s; i < n; i+=2)
  24.         {
  25.                 if (a[i] > a[i+1])
  26.                 {
  27.                         if (a[i] > max)
  28.                         {
  29.                                 max = a[i];
  30.                         }

  31.                         if (a[i+1] < min)
  32.                         {
  33.                                 min = a[i+1];
  34.                         }
  35.                 }

  36.                 else
  37.                 {
  38.                         if (a[i+1] > max)
  39.                         {
  40.                                 max = a[i+1];
  41.                         }

  42.                         if (a[i] < min)
  43.                         {
  44.                                 min = a[i];
  45.                         }
  46.                 }
  47.         }
  48. }
复制代码


比较次数约为3n/2

论坛徽章:
0
33 [报告]
发表于 2007-04-10 09:31 |只看该作者
可以试一试多路并归的方式算算

论坛徽章:
0
34 [报告]
发表于 2007-04-10 10:54 |只看该作者
LZ 你的题目没有出严谨,如果你不对于你的数组的分布情况做一个描述的话,那么别人很难给出一个有价值的答案,
你的题目的原旨应该是要求给出一个时间度最小的排序算法把!所以你需要告诉我们你的数据的分布哦!

论坛徽章:
0
35 [报告]
发表于 2007-04-10 22:13 |只看该作者

这个就是比较排序法了~

原帖由 zwylinux 于 2007-4-9 12:34 发表


这个不需要排序,但是也不可能比O(n)快
[code]
void maxmin(int a[], int n){
  int i,max,min;

  max=a[0];
  min=a[0];
  for (i=1;i<n;++i){
    if (a>max)
      max = a;
    e ...


这个就是比较排序法了~

论坛徽章:
0
36 [报告]
发表于 2007-04-10 23:25 |只看该作者
O(n)
因为要照顾到每一个数,所以只能这样了,

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
37 [报告]
发表于 2007-04-10 23:33 |只看该作者
不知道你们都在讨论什么?

论坛徽章:
0
38 [报告]
发表于 2007-04-10 23:50 |只看该作者
原帖由 flw 于 2007-4-10 23:33 发表
不知道你们都在讨论什么?

他们都不看LZ的题目是啥。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP