结构体 快速排序的问题

macfan 2013-09-10 04:36:42
2412 0 0 0
2417 22 0 0
2422 0 0 0
2427 0 0 0
2432 0 0 0
2442 0 0 0
2447 23 12 0
2437 0 0.5 0
2452 0 0 0
2457 0 0 0
2462 0 23 0
2467 0 0 0
2472 0 0 0
2484 0 333 0

以上是我要排序的数据,我用一个结构体储存。
struct CableLoss
{
int fre;
double value[10];
};
fre 表示 第一列的频率
value[10]储存后面的数据。
现在要按照fre排序即可。

我的code如下

CableLoss Atten_2G[20];

int cmp( const void *a ,const void *b)
{
return (*(CableLoss *)a).fre > (*(CableLoss *)b).fre ? 1 : -1;
}

qsort(Atten_2G,count_2G,sizeof(Atten_2G[0]),cmp);

但是发现结果是不对的,是否是结构体中的数组影响。
如何才能正确按照fre排序,value值必须和fre对逐行对应。


暂时没分了,等下追加一下。
...全文
422 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
macfan 2013-09-13
  • 打赏
  • 举报
回复
已找到问题,qsort没错 是别的模块出问题了。
cao_julians 2013-09-12
  • 打赏
  • 举报
回复
引用 10 楼 lm_whales 的回复:
减法,和比较,对于qsort,是无差别的 实际上 比较指令执行的,就是减法,只是只修改状态寄存器,不修改累加器(不修改任何操作数)
比较的结果是真(非零)和假(零),只有两个 减法的结果(差)则是三个,正、零、负 不要混为一谈
lm_whales 2013-09-12
  • 打赏
  • 举报
回复
引用 14 楼 cao_julians 的回复:
[quote=引用 10 楼 lm_whales 的回复:] 减法,和比较,对于qsort,是无差别的 实际上 比较指令执行的,就是减法,只是只修改状态寄存器,不修改累加器(不修改任何操作数)
比较的结果是真(非零)和假(零),只有两个 减法的结果(差)则是三个,正、零、负 不要混为一谈[/quote] 你再看看,我的代码,再说不迟,比较的结果, 如果只考虑高级语言,是两个,不错,如果从汇编语言考虑,那是若干个。 不过高级语言,有各种控制语句,赋值语句,C,C++ 还有 ? : 运算符 运用两次 ?: 就可以得到三个结果 不过,你的方法,确实简单,快捷,值得称赞。 多谢了!
qq237816260 2013-09-11
  • 打赏
  • 举报
回复
奇怪呢,找不出什么错误,count_2g露珠放的数少于20导致后面的没排序?错误是全部都没排过还是什么呢?
ri_aje 2013-09-11
  • 打赏
  • 举报
回复
为啥不用 std::sort,那么多 ** 配合 qsort,看着不烦吗。
lm_whales 2013-09-11
  • 打赏
  • 举报
回复
哦,有点差别,减法要快一点!!!
lm_whales 2013-09-11
  • 打赏
  • 举报
回复
减法,和比较,对于qsort,是无差别的 实际上 比较指令执行的,就是减法,只是只修改状态寄存器,不修改累加器(不修改任何操作数)
lm_whales 2013-09-11
  • 打赏
  • 举报
回复
引用 8 楼 cao_julians 的回复:
((type*)a)->pre -((type*)b)->pre
你是对的,不过,结果是一样的. 1) +,0,- 2) -,0,+ 只是,升序 和降序的区别.
cao_julians 2013-09-11
  • 打赏
  • 举报
回复
((type*)a)->pre -((type*)b)->pre
cao_julians 2013-09-11
  • 打赏
  • 举报
回复
引用 5 楼 lm_whales 的回复:
int cmp( const void *a ,const void *b) 相等,返回0,其他返回 负数,正数 共三种情况 不是0,1
按两个比较对象的大于、等于、小于关系返回正数、0、负数 对于整数的比较对象,应该是 (*(type*)a).pre-(*(type*)b).pre 或者 (type*)a->pre-(type*)b->pre 来生成返回值
lm_whales 2013-09-11
  • 打赏
  • 举报
回复
#ifndef _countof #define _countof(a) (sizeof(a) /sizeof(a[0])) int intcmp(int a,int b) { return a ==b ? 0: a<b ?-1:1; } CableLoss Atten_2G[20]={.....}; int cmp( const void *a ,const void *b) { return intcmp(*(CableLoss *)a).fre , (*(CableLoss *)b).fre ); } qsort(Atten_2G,_countof(Atten_2G),sizeof(Atten_2G[0]),cmp); PS: 你这个快排,不会太快, double value[10]; 数据,也太多了,你只需要3个,你这里要10个 巨型个数据,可以对指针排序
lm_whales 2013-09-11
  • 打赏
  • 举报
回复
int cmp( const void *a ,const void *b) 相等,返回0,其他返回 负数,正数 共三种情况 不是0,1
rocktyt 2013-09-10
  • 打赏
  • 举报
回复
引用 3 楼 zhao4zhong1 的回复:
qsort(Atten_2G,20,sizeof(Atten_2G[0]),cmp);
你看不懂count_2G是什么意思? 如果数组没放满20个呢?
赵4老师 2013-09-10
  • 打赏
  • 举报
回复
qsort(Atten_2G,20,sizeof(Atten_2G[0]),cmp);
赵4老师 2013-09-10
  • 打赏
  • 举报
回复
return (*(CableLoss *)a).fre - (*(CableLoss *)b).fre; 
rocktyt 2013-09-10
  • 打赏
  • 举报
回复
没看出来有什么错误…… 硬要说的话,cmp在比较2个相同值的时候也是返回-1了,正确的应该是0 不知道会不会有影响,没试过

64,648

社区成员

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

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