对于qsort和sort使用效率的详细对比

测试环境 VS2017
思路:用qsort与sort分别对有n个随机数的数组进行m次排序。
平台:x64

sort:


头文件: algorithm
函数原型:

template< class RandomIt >
  void sort( RandomIt first, RandomIt last );
  
template< class RandomIt, class Compare >
  void sort( RandomIt first, RandomIt last, Compare comp );

  
sort作为STL库的成员函数,肯定是本着库通用的目的,采用模板元编程实现,可对STL库提供的大部分(?不知道是不是所有,目前仅排序过vector,string(list有自己的sort))容器进行排序(我猜应该是只能针对连续地址的数据进行排序)。
参数值:要排序的起始迭代器位置,尾后迭代器位置,比较函数(可选)。默认是升序排列。

如果想要降序排列,可以:1,重载要排序的元素类型的<操作符
2,传递一个比较函数,如果第一个参数小于第二个该函数,返回true(升序)。
如果第一个参数大于第二个该函数,返回true(降序)。

比较函数的原型为:

bool cmp(const Type1 &a, const Type2 &b);
cmp 函数的返回值 描述
true elem1将被排在elem2前面
false 对elem1与elem2的次序不做改变

qsort:


头文件: cstdlib
函数原型:

void qsort(void *base , int nelem ,int width , int (*fcmp)(const void *,const void *));

qsort作为C语言标准库函数,可对连续地址存储的变量进行排序,没有默认排序方式,必须传入比较函数,并且相对于sort的操作符重载的方式改变排序规则的策略来讲,qsort只能通过改变比较函数的方式进行排序,策略单一。
参数值:排序的起始地址,排序的元素长度,要排序元素在内存中的占位值(即sizeof),比较函数指针

比较函数的原型为:

int compare( (void *) & elem1, (void *) & elem2 );
compare 函数的返回值 描述
“< 0” elem1将被排在elem2前面
“0” elem1 等于 elem2
“> 0” elem1 将被排在elem2后面

**这里需要注意的是,不同于qsort的比较函数,fcmp返回的是一个int值类型,而不是单纯的true和false
如果比较函数写成**

int comp(const void*a, const void*b)
{
    return *(int*)a>*(int*)b;//当a<b时就会返回false,也就是0,那么会被qsort认为二者相等,最终导致排序错误

    /*正确写法*/
    //return *(int*)a-*(int*)b;
}

使用实例及效率比较:


最开始我是看到这篇文章中对于二者的比较:http://blog.csdn.net/pku_zzy/article/details/51462417
作者得出的结论是,qsort比sort的效率高,一般情况下前者的用时是后者的三分之一,所以他推荐在一般情况下我们应该选择qsort而不是sort。

对这一结论我有疑惑:qsort只是实现了快速排序,而STL库中的sort实现了快

  • 59
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值