免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5910 | 回复: 8
打印 上一主题 下一主题

任给一组数字(整数), 如何快速求得中间值. [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-05-23 01:38 |只看该作者 |倒序浏览
首先想到是排序后取中间值, 有没有更好的算法?
从快速排序的结构看, 应该可以在不用完全排序便可求得中间值.

论坛徽章:
0
2 [报告]
发表于 2005-05-23 09:42 |只看该作者

任给一组数字(整数), 如何快速求得中间值.

中间值是什么意思啊?
比如
1 2 3 4,那中间值是几啊?2.5吗?

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
3 [报告]
发表于 2005-05-23 10:44 |只看该作者

任给一组数字(整数), 如何快速求得中间值.

基于快速排序的不完全排序实现
  1. #include <time.h>;

  2. void swap(int *ary, int i, int j)
  3. {
  4.     int t;
  5.     t = ary[i]; ary[i] = ary[j]; ary[j] = t;
  6. }

  7. int middle(int *ary, int num)
  8. {
  9.     int low, high, elem, begin, end;

  10.     begin = 0; end = num;
  11.     while( begin < end ) {
  12.         elem = ary[begin];
  13.         low = begin;
  14.         high = end;
  15.         while(ary[++low] < elem && low < high);
  16.         while(ary[--high] >; elem && high >;= low);
  17.         while(low < high) {
  18.             swap(ary, low, high);
  19.             while(ary[++low] < elem && low < high);
  20.             while(ary[--high] >; elem && high >;= low);
  21.         }
  22.         swap(ary, begin, high);

  23.         if(high >; num / 2)
  24.             end = high;
  25.         else if(high < num / 2)
  26.             begin = high + 1;
  27.         else
  28.             break;
  29.     }

  30.     return ary[high];
  31. }

  32. int main(int argc, char *argv[])
  33. {
  34.     int i, ary[100], num, result;

  35.     num = atoi(argv[1]);
  36.     srand(time(NULL));
  37.     printf("Arry :");
  38.     for(i = 0; i < num; i++) {
  39.        ary[i] = rand() % 100;
  40.        printf("%d  ", ary[i]);
  41.     }
  42.     printf("\n");

  43.     result = middle(ary, num);

  44.     printf("Last Arry :");
  45.     for(i = 0; i < num; i++)
  46.        printf("%d  ", ary[i]);
  47.     printf("\n");

  48.     printf("Result :%d\n", result);
  49. }
复制代码

论坛徽章:
0
4 [报告]
发表于 2005-05-24 13:30 |只看该作者

任给一组数字(整数), 如何快速求得中间值.

谢谢yuxh.
比如说, 快速排序第一次二分后, 如二分的轴已经接近中位, 会不会作一两次选择排序, 便求得中位值? 有没有相关的算法?

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
5 [报告]
发表于 2005-05-24 13:44 |只看该作者

任给一组数字(整数), 如何快速求得中间值.

一次二分以后,就算接近中位,但不是中位,也没法很快得到中位值的,只能说中位值在某个半区中(那个半区中的数都没排序,你知道哪个是中位值?)

论坛徽章:
0
6 [报告]
发表于 2005-05-24 13:57 |只看该作者

任给一组数字(整数), 如何快速求得中间值.

如果只差一个位便到中位, 只需在较多的一组中选最大值或最小值便是, 但以上是很理想的情形.

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
7 [报告]
发表于 2005-05-24 14:50 |只看该作者

任给一组数字(整数), 如何快速求得中间值.

你的想法是错误的,和最大最小值没有关系

论坛徽章:
0
8 [报告]
发表于 2005-05-24 15:38 |只看该作者

任给一组数字(整数), 如何快速求得中间值.

Quick sort 找了一次 pivot 后, pivot 的一边总比另一边大, 中间值必在较多的那边, 如果pivot的位置接近中位附近, 只需在较多的那边求几次最大值或最小值便已找到中间值.

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
9 [报告]
发表于 2005-05-24 15:48 |只看该作者

任给一组数字(整数), 如何快速求得中间值.

如偏移中间n个数,那就要找第n个大(小)的数,这个开销是不确定的。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP