免费注册 查看新帖 |

Chinaunix

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

关于qsort对double数组排序的怪异数据问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-04-09 17:54 |只看该作者 |倒序浏览
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. #define        GETY(a, b)        ((double)((a[3] - a[1]) * (b - a[0]) / (a[2] - a[0])) + a[1])
  4. #define        MAX(a, b)        ((a) > (b)) ? (a) : (b)
  5. #define        MIN(a, b)        ((a) < (b)) ? (a) : (b)

  6. int        LINE2[32  * 1024][4];
  7. double        LINE3[512 * 1024][7];

  8. int cmp(const void *a, const void *b) {
  9.         double        x, y;

  10.         x = ((double *)a)[0];
  11.         y = ((double *)b)[0];

  12.         if( x > y )        return 1;
  13.         if( x < y )        return -1;

  14.         x = ((double *)a)[4];
  15.         y = ((double *)b)[4];

  16.         if( x > y )        return 1;
  17.         if( x < y )        return -1;

  18.         x = ((double *)a)[1];
  19.         y = ((double *)b)[1];

  20.         if( x > y )        return 1;
  21.         if( x < y )        return -1;
  22.         return 0;
  23. }

  24. int main() {
  25.         int        C, L1, L2, L3, i, j, f, d, t;

  26.         fscanf(stdin, "%d", &C);
  27.         while(C--) {
  28.                 fscanf(stdin, "%d %d", &L1, &L2);
  29.                 for(i = 0, L3 = 0; i < L2; i++) {
  30.                         fscanf(stdin, "%d %d %d %d", &LINE2[i][0], &LINE2[i][1], &LINE2[i][2], &LINE2[i][3]);

  31.                         if(LINE2[i][0] > LINE2[i][2]) {
  32.                                 t = LINE2[i][0];
  33.                                 LINE2[i][0] = LINE2[i][2];
  34.                                 LINE2[i][2] = t;
  35.                                 t = LINE2[i][1];
  36.                                 LINE2[i][1] = LINE2[i][3];
  37.                                 LINE2[i][3] = t;
  38.                         }

  39.                         for(j = LINE2[i][0], f = 0; ; j++) {
  40.                                 LINE3[L3][0] = (double)j;
  41.                                 LINE3[L3][1] = GETY(LINE2[i], j);
  42.                                 LINE3[L3][2] = (double)(j + 1);
  43.                                 LINE3[L3][3] = GETY(LINE2[i], (j + 1));
  44.                                 LINE3[L3][4] = MIN(LINE3[L3][1], LINE3[L3][3]);
  45.                                 LINE3[L3][5] = MAX(LINE3[L3][1], LINE3[L3][3]);
  46.                                 LINE3[L3][6] = (double)L3;
  47. //printf("[%d]:[(%f,%f);(%f,%f)]\n", L3, LINE3[L3][0], LINE3[L3][1], LINE3[L3][2], LINE3[L3][3]);
  48.                                 L3++;

  49.                                 if(LINE2[i][2] == j + 1)
  50.                                         break;
  51.                         }
  52.                 }

  53.                 qsort(LINE3, L3, sizeof(LINE3[0]), cmp);


  54.                 for(i = 1, d = 0; i < L3 - 1; i++) {
  55.                         for(j = i + 1; j < L3; j++) {
  56.                                 printf("[%d:%d]#[(%f,%f);(%f,%f)]#[(%f,%f);(%f,%f)][%f]", i, j, LINE3[i][0], LINE3[i][1], LINE3[i][2], LINE3[i][3], LINE3[j][0], LINE3[j][1], LINE3[j][2], LINE3[j][3], LINE3[j][6]);
  57.                                 if((LINE3[i][5] <= LINE3[j][4])
  58.                                         || (LINE3[i][0] < LINE3[j][0])) {
  59.                                         printf(" break\n");
  60.                                         break;
  61.                                 }

  62.                                 if((LINE3[i][1] > LINE3[j][1] && LINE3[i][3] < LINE3[j][3])
  63.                                         || (LINE3[i][1] < LINE3[j][1] && LINE3[i][3] > LINE3[j][3])) {
  64.                                         printf(" cross\n");
  65.                                         d++;
  66.                                 }
  67.                                 else {
  68.                                         printf(" none\n");
  69.                                 }
  70.                         }
  71.                 }
  72.                 printf("%d\n", d);
  73.         }
  74. }
复制代码


数据的数据量非常大,重定向到文件里面。
在32766行,出现了异常数据,不知道哪里来的。



  1. [32765:32766]#[(0.000000,32765.000000);(1.000000,32765.000000)]#[(0.000000,32766.000000);(1.000000,32766.000000)][491505.000000] break
  2. [32766:32767]#[(0.000000,32766.000000);(1.000000,32766.000000)]#[(0.000000,0.000000);(0.000000,0.000000)][0.000000] break
  3. [32767:32768]#[(0.000000,0.000000);(0.000000,0.000000)]#[(0.000000,0.000000);(0.000000,0.000000)][0.000000] break
复制代码

[ 本帖最后由 lovelyarry 于 2007-4-9 19:32 编辑 ]

a.rar

8.19 KB, 下载次数: 17

测试数据

论坛徽章:
0
2 [报告]
发表于 2007-04-09 18:32 |只看该作者
32767,这个数字很熟悉啊。。16位signed int的最大整数。会不会和这个有关?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP