当前位置: 首页 > article >正文

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


总结

未完待续


http://www.kler.cn/a/518099.html

相关文章:

  • 《CPython Internals》阅读笔记:p353-p355
  • 正点原子Linux 移植USB Wifi模块MT7601U驱动(上)
  • Android-UI自动化测试环境配置
  • 【C语言算法刷题】第2题 图论 dijkastra
  • PBFT算法
  • ESG报告流程参考
  • 【深度学习】搭建PyTorch神经网络进行气温预测
  • Qt 5.14.2 学习记录 —— 십구 事件
  • 豆包MarsCode 蛇年编程大作战 | 高效开发“蛇年运势预测系统”
  • Effective C++读书笔记——item23(用非成员,非友元函数取代成员函数)
  • Redis实现,分布式Session共享
  • S4 HANA Tax相关的定价过程
  • c#使用log4Net配置日志文件
  • idea maven本地有jar包,但还要从远程下载
  • 使用ArcMap或ArcGIS Pro连接达梦数据库创建空间数据库
  • 为什么redis会开小差?Redis 频繁异常的深度剖析与解决方案
  • 【ARM】解决MDK在打开工程的时候提示CMSIS的版本不对问题
  • kettle从入门到精通 第九十一课 ETL之kettle http接口下载文件流
  • Java设计模式:结构型模式→桥接模式
  • LabVIEW太阳能照明监控系统