想了解下qsort的cmp参数的机理

测试昵称666 2011-01-12 06:10:37
今天在做一个HDOJ的题目时,用了qsort,
我写cmp函数是这样的:
是比较两个结构体的
typedef struct stick{
int l;
int w;
}Stick;

int cmp(const void *arg1, const void *arg2)
{
Stick *v1 = (Stick*)arg1;
Stick *v2 = (Stick*)arg2;
if(v1->l > v2->l || (v1->l==v2->l && v1->w>v2->w))
return 1;
return 0;
}


后来显示错误,找了半天,发现是这里错了,
cmp返回有三种结果1, 0, -1
而我把-1也当成0返回了。


个人认为返回0时不变,返回-1代表前者比后者小,也不变,而返回1时,代表前者比后者大,应该变换两者位置。
但是我觉得,比如两个结构体变量(1, 3)和(3, 1)

如果原排列是(1,3),(3,1),他们比较,1 < 3,返回0,所以应该顺序不变,
而当原排列是(3, 1), (1, 3)时,3>1,返回1,所以第一个比第二个大,应该把两者位置变换。

所以这样只返回0也应该可以按升序排列。
但是实际却不对,为何?
...全文
225 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
ryfdizuo 2011-01-12
  • 打赏
  • 举报
回复
google一下就可以的,看一下源码:
http://www.zaoxue.com/article/tech-55036.htm
测试昵称666 2011-01-12
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 xy_zhang 的回复:]
引用 4 楼 wtq493841534 的回复:

引用 3 楼 xy_zhang 的回复:
compare这个规则就是你自己定的,你希望是怎样就写成怎样。另外,返回0是相等(或等价?)的意思吧?


对,我是想知道,cmp返回0和返回-1,有何区别?
我在提问时解释了。


哦,那就要看qsort的代码了~~
[/Quote]

刚试了下,发现很复杂的说:
int compare (const void * a, const void * b)
{
cout << "a=" << *(int*)a << ", b=" << *(int*)b << " : ";
if(*(int*)a > *(int*)b)
{
cout << "1" << endl;
return 1;
}
else
{
cout << "2" << endl;
return 0;
}
}
结果不知所云,算了,我想太多了。

结贴。
xy_zhang 2011-01-12
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 wtq493841534 的回复:]

引用 3 楼 xy_zhang 的回复:
compare这个规则就是你自己定的,你希望是怎样就写成怎样。另外,返回0是相等(或等价?)的意思吧?


对,我是想知道,cmp返回0和返回-1,有何区别?
我在提问时解释了。
[/Quote]

哦,那就要看qsort的代码了~~
ayw215 2011-01-12
  • 打赏
  • 举报
回复
1是一个比另一个大
0是相等
-1是一个比另一个小
我记得貌似是这样的
测试昵称666 2011-01-12
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 xy_zhang 的回复:]
compare这个规则就是你自己定的,你希望是怎样就写成怎样。另外,返回0是相等(或等价?)的意思吧?
[/Quote]

对,我是想知道,cmp返回0和返回-1,有何区别?
我在提问时解释了。
xy_zhang 2011-01-12
  • 打赏
  • 举报
回复
compare这个规则就是你自己定的,你希望是怎样就写成怎样。另外,返回0是相等(或等价?)的意思吧?
测试昵称666 2011-01-12
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 dizuo 的回复:]
C/C++ code
/* qsort example */
#include <stdio.h>
#include <stdlib.h>

int values[] = { 40, 10, 100, 90, 20, 25 };

int compare (const void * a, const void * b)
{
return ( *(int*)a - *(int*……
[/Quote]

。。。
我是想了解返回0和返回-1的处理。
我感觉这两者的处理应该都是不变。
ryfdizuo 2011-01-12
  • 打赏
  • 举报
回复
/* qsort example */
#include <stdio.h>
#include <stdlib.h>

int values[] = { 40, 10, 100, 90, 20, 25 };

int compare (const void * a, const void * b)
{
return ( *(int*)a - *(int*)b );
}

int main ()
{
int n;
qsort (values, 6, sizeof(int), compare);
for (n=0; n<6; n++)
printf ("%d ",values[n]);
return 0;
}

64,646

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧