免费注册 查看新帖 |

Chinaunix

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

[算法] 100W个随机数据里面找出最大的5个 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-11-14 16:08 |只看该作者 |倒序浏览
生成100w随机数
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. main()
  5. {
  6.   FILE *fp;
  7.   long get;
  8.   long i=0;
  9.   srand((unsigned)time(NULL));
  10.   fp = fopen("srand.txt","w");
  11.   for(i=0;i<1000000;i++)
  12.    {
  13.     get = rand();
  14.     fprintf(fp,"%d\n",get);
  15.     }
  16.    fclose(fp);
  17. }
复制代码


读入数据

  1. #include<stdio.h>
  2. void  sort( ******);
  3. main()
  4. {
  5.   int t;
  6.   char *s;
  7.   FILE *fp;
  8.   s = malloc(100);
  9.   fp = fopen("srand.txt","r");
  10.   while(!feof(fp))
  11.    {
  12.     fgets(s,100,fp);
  13.     t = atoi(s);
  14.     sort(***);
  15.    }
  16. free(s);
  17. fclose(fp);
  18. }
复制代码


到选用算法的时候就特别郁闷。难道我弄一个100w的数组来用吗?

论坛徽章:
0
2 [报告]
发表于 2007-11-14 16:09 |只看该作者
只用一个5个元素大的数组就行了,不用排序。

论坛徽章:
0
3 [报告]
发表于 2007-11-14 16:29 |只看该作者
以前有朋友也这样建议过我。做一个五个数的数组,可以先取前5个到数组里,对它们进行排序。然后取6到100w的数据跟这个五位的数组比较。这个数组也可以优化一下,就是设立前中后指针。分别对应小中大的数。如果取出来的数比最小的还小,就抛弃数组里最大的那个数。如果大于最大的数,可以直接不管。
这好几天都在想这个问题。我看好多实现都是用指针。总是被绕的晕乎乎的。

论坛徽章:
0
4 [报告]
发表于 2007-11-14 17:02 |只看该作者
int sort(int in_arr[], int in_size, int out_arr[], int out_size)
{
        int i = 0;
        int cur_size = 0;
        for ( ; i < in_size; ++i) {
                int j = 0;
                for ( ; j < cur_size; ++j) {
                        if (in_arr >= out_arr[j]) {
                                int move_count = cur_size - j;
                                if (out_size == cur_size) {
                                        move_count--;
                                }
                                else {
                                        cur_size++;
                                }
                                memmove(out_arr + j + 1, out_arr + j, move_count * sizeof (int));
                                out_arr[j] = in_arr;
                                break;
                        }
                }
                if (j == cur_size && cur_size < out_size) {
                        out_arr[cur_size++] = in_arr;
                }
        }

        return cur_size;
}

论坛徽章:
0
5 [报告]
发表于 2007-11-14 17:24 |只看该作者
刚在学校的时候学过c,但都是毛皮。
holyfire  写的for循环,很有特点
int i = 0;
int cur_size = 0;
for ( ; i < in_size; ++i)

int j = 0;
for ( ; j < cur_size; ++j)
不知道这种编程的风格是大家都有的,还是holyfire的个人特色!:wink:

欢迎大家拿出你的风格,小小的show一下。
我先谢谢大家的指教了。

[ 本帖最后由 lovfreebsd 于 2007-11-14 17:27 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2007-11-14 17:27 |只看该作者
使用堆. 堆只需要五个元素就行. 然后每来一个数, 将其压入堆中, 然后将最小的数去掉就可以了.

论坛徽章:
0
7 [报告]
发表于 2007-11-14 17:39 |只看该作者
原帖由 cugb_cat 于 2007-11-14 16:09 发表
只用一个5个元素大的数组就行了,不用排序。




while(!feof(fp))
  {
      fgets(s,100,fp);
      t = atoi(s);
      sort(**);
}


这个地方不知道怎么把取出来的数(t)前5个赋值给一个5位的数组。我老是一拿就是一全拿.
麻烦大家了

[ 本帖最后由 lovfreebsd 于 2007-11-16 11:29 编辑 ]

论坛徽章:
0
8 [报告]
发表于 2007-11-16 11:32 |只看该作者
大家感兴趣的话,可以写写实现代码试试.

  while(!feof(fp))
   {
    fgets(s,100,fp);
    t = atoi(s);
    ………………
   }

这里我想拿出五个数存到数组里。结果怎么着都不行,

[ 本帖最后由 lovfreebsd 于 2007-11-16 16:56 编辑 ]

论坛徽章:
0
9 [报告]
发表于 2007-11-18 12:54 |只看该作者
链表的效率应该比数组要好。

这题目说白了是用深度为5的栈可以解决的问题,如果用数组,数据移动次数太多了。不过,5个元素还不是很明显。

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
10 [报告]
发表于 2007-11-18 15:21 |只看该作者
原帖由 lovfreebsd 于 2007-11-16 11:32 发表
大家感兴趣的话,可以写写实现代码试试.

  while(!feof(fp))
   {
    fgets(s,100,fp);
    t = atoi(s);
    ………………
   }

这里我想拿出五个数存到数组里。结果怎么着都不行,

使用fscanf。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP