测试环境 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实现了快