qsort和std::sort比较函数返回值的说明
提示:文章
文章目录
- 前言
- 一、背景
- 二、
- 三、
- 3.1
- 总结
前言
前期疑问:
本文目标:
一、背景
最近
二、
qsort和std::sort比较函数返回值的说明
对于c语言的比较函数qsort,比较函数的返回值说明如下
int compare(const void* a, const void* b)
{
return *(int*)a - *(int*)b;
}
如果a - b < 0;a在b的前面。
如果a - b > 0; a在b的后面。
假设需要排序的数组为[5, 3, 1, 7, 4],那么对于5和3而言,5-3>0,5在3的后面。同理,对于1和7而言,1-7<0,1在7的前面。所以这个排顺序是升序。
之前写过一次代码,好像经过qsort排序后,没有实现想要的排序效果,当时还疑惑是不是因为返回负数会影响结果。实际上qsort可以返回负数的。下次如果在遇到应该就好理解了吧。
std::sort
对于c++的std库函数sort,比较函数形式如下
int compare(const void* a, const void* b)
{
if(a > b) {
return true;
}
return false;
}
//上述形式不对,区别于qsort比较函数写法,正确形式如下
bool compare(int a, int b)
{
if (a > b) {
return true;
}
return false;
}
sort比较函数说明如下:
返回true,则a在b前面。对于[0,5, 3, 1, 7, 4],那么对于5和3而言,5 > 3,5在3的前面。最后结果就是大的值在前面,为降序。
现在增加一个需求,就是将0放在排序的最后。代码写成下述形式
bool compare(int a, int b)
{
if (a == 0 || b == 0) {
return false;
}
if (a > b) {
return false;
}
return true;
}
//打印信息
0 1 3 4 5 7
对于0,返回false,a放后面,最后a=0在最后面。(事实验证这个表述是不对的, 起码对于上述的代码如此)
下面的代码可以将0放最后,但是不符合我的预期。。就是if(a == 0 || b == 0)那边应该返回false的。因为当变量为0时,应该反不会false,则这个值应该放在最后。
bool compare(int a, int b)
{
if(a == 0 || b == 0) {
return true;
}
if (a > b) {
return false;
}
return true;
}
// 1 3 4 5 7 0
分析代码逻辑,实际上上面的代码有个问题,就是if(a == 0 || b == 0)这行代码。当返回false时,当是a为0时,a=0放最后,这边没有问题。但是当b=0时,也是返回fasle,则a会放b后面,b=0又放前面了。这就是问题的所在。
至于为什么上面的也能实现效果,还不确定。
哈哈,终于写成了正确的形式,这也解释了为什么traffic代码写成那样,实际分析逻辑就是写成下述这样,也是traffic代码写的形式。
bool compare(int a, int b)
{
if (a == 0 && b != 0) {
return false;
}
if (a != 0 && b == 0) {
return true;
}
if (a > b) {
return false;
}
return true;
}
// 1 3 4 5 7 0
上述代码的理解就是,当a为0且b不等于0时,能够安全的返回false,让a=0在最后面。同理, 当if (a != 0 && b == 0)时,应该返回true,让a在前面,b=0在后面,最后就是0在最后面。
最后还有一个问题,就是当代码写成下述形式,排序会失效。数据打印结果就是没有排序。
bool compare(int a, int b)
{
if (a > b) {
return false;
}
return false;
}
// 0 5 3 1 7 4
三、
3.1
总结
未完待续