作者TommyKSHS (汤米)
看板b98902HW
标题Re: [计程] qsort()
时间Wed Oct 28 14:28:21 2009
你这个有点 bug...
int cmp(const void* A,const void* B ){
int* A = (int*) a;//将原本为void*的a
转型为int*并指定给A
int* B = (int*) b;
if( *A < *B ) return -1; //若*A比*B小,代表A的顺位比较前面
else if( *A == *B ) return 0;
else return 1;
return 0;
}
我觉得应该是 int cmp(const void
*a,const void
*b)
补充一下, -1 0 1 代表的是 负 零 正
也就是说整个 cmp 可以写成
int cmp(const void *a,const void *b)
{
return *(int*)b-*(int*)a;
}
不过,…这个写法虽然比较简捷,可是要小心可能某些 TA 会出阴险的 testdata
然後 *(int*)b-*(int*)a 就会 overflow... 到时候就 WA 到天荒地老了
--
╭═══╤═══╮ ╰═╮ ╭═╯
│ │ │╭═和平,土地,面包═╮ │ │
│ ╭═╧╧╮╤═╤═╮═╤═╤╧╮ │ │
│ │ ││ │ │ │ │ │ ╰═╤═╯
│ │ ││ │ │ │ │ │ │
╰╧╯╰═══╯╰ ╰ ╰ ╰ ╰ ╰ ─╯
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.112.239.191
1F:→ silentvow:应该是 *(int*)b-*(int*)a 吧? 10/28 14:35
2F:推 hallogameboy:噢对耶,感谢Tommy~ 10/28 14:41
3F:→ hallogameboy:恩因为怕overflow所以建议自己判断之後再输出~ 10/28 14:42
4F:→ mimi9126:其实在这堂课不太需要考虑这种oveflow的问题,因为那"还" 10/28 15:07
5F:→ mimi9126:不是这些题目的重点,相对的我反而希望你们能注意看每个 10/28 15:07
6F:→ mimi9126:题目给的范围,很多时候从范围就可以知道大概会有啥问题 10/28 15:08
7F:→ mimi9126:不过本篇这种写法的确是比较好的 10/28 15:09
8F:推 YAOMMENT:为什麽不是*(int*)a-*(int*)b阿 10/28 15:13
9F:→ mimi9126:看要ascending还是decending 10/28 15:49
10F:→ TommyKSHS:阿 一楼说的对 10/28 16:10
11F:→ TommyKSHS:我改一下 10/28 16:10
※ 编辑: TommyKSHS 来自: 140.112.239.191 (10/28 16:11)
※ 编辑: TommyKSHS 来自: 140.112.239.191 (10/28 16:14)
12F:推 sa072686:这个很常见…所以讲qsort()有必要提一下overflow 10/28 18:22
13F:→ sa072686:不然哪天被阴了可能都不知道XD 10/28 18:23
14F:推 anfranion:范围很重要啊~ 也还是要考虑overflow的~ 10/28 20:53
15F:→ anfranion:不然就不会有何木木问题了~ 10/28 20:53
16F:→ zenixls2:我有个东西想问,好像只回传0和1其实不影响正确性?! 10/28 23:47
17F:→ zenixls2:因为像sort的回传也只是0和1...那个-1好像没必要?? 10/28 23:47
18F:推 davll:对标准C函式库而言,compare是代表差值的正负或零(ex:strcmp) 10/28 23:52
19F:→ zenixls2:不过我想应该是因为没太大意义才会在C++改成二分 10/29 01:09
20F:推 davll:嗯,因为已经有分stable_sort与sort了,cmp就变成< or >了 10/29 19:07