qsort 要注意的问题

   大家竞相转载的 《 qsort的七种排序》里面有不少细节问题,由于原版不知道是哪里的,所以部分错误可能是转载人漏掉或者误添的,这个暂且不谈,不过今天在hnu的论坛上看见yiyi的回复才知道原来最大的问题是出在作者的cmp函数里面:
int  cmp (  const   void   * a ,  const   void   * b )
{
     
return *(int *)a - *(int *)b;
}

这个问题出在 当a是int的最大值(2^31 - 1),b是int的最小值(-2^31)时,a - b会溢出,返回了一个正数,言下之意就是说a < b了,这显然是错误的了。(赞一下yiyi,估计srm 中cha人cha的比较多了)

这个问题比较好的解决方法是采用比较,而不是这种看似很有“技巧”的写法或者使用STL中的std::sort

下面给出测试代码,希望大家少犯错误:-)

#include  < cstdlib >
#include 
< algorithm >
#include 
< iostream >

using   namespace  std;

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


int  cmp2( const   void   * a,  const   void   * b)
{
    
int aa = *(int *)a;
    
int bb = *(int *)b;

    
if(aa == bb)
        
return 0;
    
else if(aa < bb)
        
return -1;
    
else
        
return 1;
}


bool  cmp3( const   int  a,  const   int  b)
{
    
return a < b;
}


int  main()
{
    
int a[] = {-0x7fffffff - 10x7fffffff};
    qsort(a, 
2sizeof(a[0]), cmp);
    cout 
<< a[0<< " " << a[1<< endl;

    
int b[] = {-0x7fffffff - 10x7fffffff};
    qsort(b, 
2sizeof(b[0]), cmp2);
    cout 
<< b[0<< " " << b[1<< endl;

    
int c[] = {-0x7fffffff - 10x7fffffff};
    sort(c, c 
+ 2, cmp3);
    cout 
<< c[0<< " "  << c[1<< endl;

    
return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值