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

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

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

sort则需要<algorithm>

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<a2  ------  [qsort]:a1-a2<0 (或a1-a2=0)  等式成立为真(sort)或为负/零(qsort)时,不交换.其它交换.
个人感觉这样就统一好记多了,不用再查了,也不容易错了。

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

---------------------------------------------------------------------------------------------------------------------------------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<iostream>, #include<algorithm>两个头文件,和命名空间namespace std 或者std::sort();
#include<iostream>
#include<algorithm>
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语言中自带函数库中的一个函数,包含在 <stdlib.h> 头文件中
下面是 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<algorithm>的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 <iostream>
#include <cstdlib>
#include <cstring>
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<len;i++)
        cout<<a[i]<< ' ';
     cout << endl;
     qsort(a,len,sizeof(char),compare);
     for(i=0;i<len;i++)
        cout<<a[i]<< ' ';
     return 0;
}
/*在对浮点或者double型的一定要用三目运算符,因为要是使用像整型那样相减的话,
如果是两个很接近的数则可能返回一个很小的小数(大于-1,小于1),而cmp的返回值是int型,
因此会将这个小数返回0,系统认为是相等,失去了本来存在的大小关系*/

#include <iostream>
#include <algorithm>
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个数,程序也会直接崩溃,因为这不是严格弱序。
编译器优化:性能比较(图).

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值