• C++排序函数sort()和qsort()的参数比较函数的统一记忆方法


    前言:每次写排序函数sort或qsort都怕搞错参数的比较函数的规则,都需要来查一查确认下. 查得多了自然就总结到了个方法,下面,分享出来看能否有助于大家。加粗红色字体内容是个人认为的需要注意的内容。

    qsort需要引入头文件<stdlib.h>

    sort则需要

    sort(数组名,数组末地址,compare)    //若不写compare则默认升序排列
    sort(begin,end,compare)
    关于参数compare,compare带两个同类型的参数,如果第一个参数排在第二个参数前面,返回true,否则返回false

    qsort(数组名 ,元素个数,元素占用的空间(sizeof),比较函数
    void qsort(void *base, int nelem, unsigned int width, int ( * pfCompare)( const void *, const void *));
    qsort 函数的用法规定,“比较函数”的原型应是:int 函数名(const void * elem1, const void * elem2);
    该函数的两个参数,elem1 和elem2,指向待比较的两个元素。也就是说, * elem1 和* elem2 就是待比较的两个元素。该函数必须具有以下行为:
      1) 如果 * elem1 应该排在 * elem2 前面,则函数返回值是负整数(任何负整数都行)。
      2) 如果 * elem1 和* elem2 哪个排在前面都行,那么函数返回0
                    (值为0时,qsort会让当前所比较的这两个元素暂时保持不动。)
      3) 如果 * elem1 应该排在 * elem2 后面,则函数返回值是正整数(任何正整数都行)。
    一定注意qsort与sort函数中自定义的比较函数compare中哪个元素应该排在前面的要求是不同的。

    sort和qsort的比较函数的统一记忆方法为: [sort]:a1
    个人感觉这样就统一好记多了,不用再查了,也不容易错了。

    以下是摘抄其它作者文章的部分内容,以供参考,也请文章的作者多多见谅。

    ---------------------------------------------------------------------------------------------------------------------------------C/C++常用排序性能测试(Morn、GSL、qsort、std::sort)
    https://blog.csdn.net/u012590570/article/details/115681040
    总结:
    项目    Morn    std::sort    GSL    qsort
    速度    快    快    慢    较慢
    数据类型    任意数值类型,其他类型使用mListSort    任意类型    double    任意类型(使用void*)
    索引    有    无(但可借助回调函数实现)    有    无(但可借助回调函数实现)
    支持回调    mListSort支持    支持    不支持    支持
    降序排序    支持    借助回调函数    不支持    借助回调函数
    最大最小子集    支持    支持    支持    不支持

    ---------------------------------------------------------------------------------------------------------------------------------

    C++ qsort 与 sort
    https://blog.csdn.net/TheGameIsFives/article/details/105618170
    假设自己定义了一个结构体node: 
    struct node{
        int a;
        int b;
        double c;
    }; 
    有一个node类型的数组node arr[100],想对它进行排序:先按a值升序排列,如果a值相同,再按b值降序排列,如果b还相同,就按c降序排列。就可以写这样一个比较函数: 
    以下是代码片段: 
    bool cmp(node x,node y) // sort (v ok)
    {
         if(x.a!=y.a)  return x.a < y.a
         if(x.b!=y.b)  return x.b>y.b;
         return  return x.c>y.c;

    排序时写sort(arr,a+100,cmp); 
    sort是一个改进版的qsort. std::sort函数优于qsort的一些特点:对大数组采取9项取样,更完全的三路划分算法,更细致的对不同数组大小采用不同方法排序。
    如果能用sort尽量用sort,使用也比较简单,不像qsort还得自己去写 cmp 函数,只要注明 使用的库函数就可以使用,参数只有两个(如果是普通用法)头指针和尾指针;
    默认sort排序后是升序,如果想让他降序排列,可以使用自己编的cmp函数

    ---------------------------------------------------------------------------------------------------------------------------------

    qsort 与sort 的比较
    https://download.csdn.net/download/ksjay_1943/1451800
    在c++中qsort()排序函数的使用qsort函数应用大全,在同样的元素和同样的比较条件下,sort()的执行速度都比qsort()要快。另外,sort()是类属函数,可以用于比较任何容器,任何元素,任何条件。

    ---------------------------------------------------------------------------------------------------------------------------------
    C++中的sort函数和qsort函数的用法和区别
    https://blog.csdn.net/qq_43247439/article/details/105577220
    使用sort函数时,必须引用#include, #include两个头文件,和命名空间namespace std 或者std::sort();
    #include
    #include
    using namespace std;

    int main(){
        int a[10];
        for (int i = 0; i < 10; ++i){
            cin >> a[i];
        }
        sort(a, a + 10);          //范围,尾地址,最后一个元素的下一个位置。因此为a+20
        for (int i = 0; i < 10; i++) {
            cout << a[i] <<" ";
        }
        cout << endl;
        return 0;
    }
    qsort与sort的区别:
    sort是一个改进版的qsort,sort函数优于qsort的一些特点:对大数组采取9项取样,更完全的三路划分算法,更细致的对不同数组大小采用不同方法排序。
    cmp函数和qsort中cmp函数的不同Sort中的cmp函数参数可以直接是参与比较的引用类型,sort可以采用标准库自带的比较函数,而qsort没有。
    ​int cmp(const int &a,const int &b){
      return a>b;
    }
    cmp函数比较时qsort用“-”,而sort用”>”.这也是一个重要的区别。
    sort函数是c++中标准模板库的的函数,在qsort()上已经进行了优化,根据情况的不同可以采用不同的算法,所以较快。
    在同样的元素较多和同样的比较条件下,sort()的执行速度都比qsort()要快。
    另外,sort()是类属函数,可以用于比较任何容器,任何元素,任何条件。使用时需调用
    sort(begin(),end(),cmp)。

    ---------------------------------------------------------------------------------------------------------------------------------
    排序函数qsort和sort那点事
    https://blog.csdn.net/weixin_61061381/article/details/123500844
    qsort函数(c语言用)
    它是C语言中自带函数库中的一个函数,包含在 头文件中
    下面是 qsort() 函数的声明☺
    void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*));
    注意受函数排序规则的底层实现影响,c语言使用cmp函数必须这样写return ( *(int*)a - *(int*)b );而不能写成return ( *(int*)a < *(int*)b );(这样写编译器会报错的)
    sort函数(用于c++)
    sort函数包含在头文件为#include的c++标准库中,调用标准库里的排序方法可以实现对数据的排序

    ---------------------------------------------------------------------------------------------------------------------------------
    C++中sort()与qsort()相关用法的总结
    原文链接:https://blog.csdn.net/weixin_45541762/article/details/107668007
    qsort()
    排序方法有很多种:选择排序,冒泡排序,归并排序,快速排序等。 看名字都知道快速排序是目前公认的一种比较好的排序算法。
    因为他速度很快,所以系统也在库里实现这个算法,便于我们的使用。 这就是qsort函数(全称quicksort)。
    它是ANSI C标准中提供的,其声明在stdlib.h文件中,是根据二分法写的,其时间复杂度为n*log(n)
    //对char型数组排序
    #include
    #include
    #include
    using namespace std;
    int compare(const void *a, const void *b)
    {
         return *(char*)a - *(char*)b; //升序
    }
    int main()
    {
         char a[]= "hello";
         int i, len = strlen(a);
         for(i=0;i         cout<      cout << endl;
         qsort(a,len,sizeof(char),compare);
         for(i=0;i         cout<      return 0;
    }
    /*在对浮点或者double型的一定要用三目运算符,因为要是使用像整型那样相减的话,
    如果是两个很接近的数则可能返回一个很小的小数(大于-1,小于1),而cmp的返回值是int型,
    因此会将这个小数返回0,系统认为是相等,失去了本来存在的大小关系*/

    #include
    #include
    enum Enumcomp{ASC,DESC};
    class compare
    {
    private:
        Enumcomp comp;
    public:
        compare(Enumcomp c):comp(c) {};
        bool operator () (int num1,int num2)
        {
            switch(comp)
            {
             case ASC:
                return num1 < num2;
             case DESC:
                return num1 > num2;
            }
            return true;//为了防止告警,其实没有实际用途
        }
    };

    int main()
    {
        int myints[] = {32, 14, 25, 47, 29, 11, 98, 56};
        std::sort(myints, myints + sizeof(myints) / sizeof(int), compare(DESC));
        for (int x : myints)
            std::cout << x << " ";
        return 0;
    }
    //接下来使用 sort(begin,end,compare(ASC)实现升序,
    //sort(begin,end,compare(DESC)实现降序。

    ---------------------------------------------------------------------------------------------------------------------------------
    C++中的 sort、qsort
    https://blog.csdn.net/nameofcsdn/article/details/104823002
    (1)return 1
    哪怕p=2,只有2个数,程序也会直接崩溃,因为这不是严格弱序。
    编译器优化:性能比较(图).

    ---------------------------------------------------------------------------------------------------------------------------------

  • 相关阅读:
    21、前端开发:CSS知识总结——transform变形属性
    多核处理器上的内存访问一致性
    C【函数】
    C++ lambda表达式
    HTML5响应式网页设计——核心技能考核示例(用于2022年11月H5考核)
    Rust开发——闭包使用示例
    什么是零日攻击?
    计算机网络学习记录 网络层 Day4(下)
    大话设计模式——4.装饰模式(Decorator Pattern)
    【自然语言处理(NLP)】基于Bi-DAF的机器阅读理解
  • 原文地址:https://blog.csdn.net/hixi2007/article/details/132825497