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

C的qsort()_C++STL的sort()_priority_queueStruct, vectorStruct, cmp 的cmp()函数排序规则总结辨析

邪门的记忆方法
qsort函数的cmp用item1>item2比较,sort函数的cmp用item1<item2比较,这样排序完是升序,反之降序
因为qsort和sort根据返回值有相反的判断。qsort在cmp返回值大于0会换顺序,而sort在cmp返回值大于0(true)时不换
greater<>()这个方法加了就是降序,不要被名字迷惑了

C的qsort()

函数原型

void qsort (void* base, size_t nitems, size_t size, int (*comparator)(const void*,const void*));

注意
qsort是非降序排序,具体大小关系由comparator函数逻辑定义

参数含义

base指向数组第一个元素的指针
nitems 数组的元素数量
size 数组中一个元素的大小,以字节为单位
comparator 指向比较函数compare的指针

compare比较函数

//在一次排序前,p1在p2的前面
int comparator(const void* p1, const void* p2); 

comparator函数返回值与0的关系决定大小关系

返回值决定元素先后

  • 如果返回值 <0 ,则认为p1小于p2,那么此次排序后p1在p2的前面
  • 如果返回值 =0 ,则认为p1等于p2,那么p1和p2的顺序有可能改变也有可能不变(不过相等了先后顺序也就无所谓了)
  • 如果返回值 >0 ,则认为p1大于p2,那么此次排序后p2在p1的前面
int compare (const void * a, const void * b){return *(int*)a > *(int*)b;
}
int main (){int arr[] = {10, 5, 15, 12, 90, 80};int n = sizeof(arr)/sizeof(arr[0]), i;//排序结果是升序qsort (arr, n, sizeof(int), compare);//如果要降序,可引用<functional>头文件,下面这样写//sort(v.begin(),v.end(),greater<int>());return 0;
}

C++的sort()函数

函数原型

template< class RandomIt, class Compare >
void sort( RandomIt first, RandomIt last, Compare comp);

参数含义
first, last是迭代器类型(指针类型),指向要排序的数组的第一个元素地址和最后一个元素的下一个地址。
comp是比较器(可以是lambda表达式,可以是函数对象)
函数作用
把[first, last)区间中的元素按照cmp中的规则按照非严格的升序排序,不稳定排序(相等的元素在排序后相对顺序可能会发生变化)
注意,这里的comp比较器的返回值是bool类型,相等时返回false,当返回值为true时,认为第一个元素比第二个元素小,不换顺序。

typedef struct{bool operator()(int a, int b) const { return a < b; }
}customLess;
std::sort(s.begin(), s.end(), customLess);

例子

#include <algorithm>
#include <functional>
#include <iostream>
#include<vector>
using namespace std;
typedef struct{//如果a<b,返回true,那么sort认为a应该在b前面,实际也是升序bool operator()(int a, int b) const { return a < b; }
}customLess;
int main(){vector<int>v;for(int i=10;i>0;i--){v.push_back(i);}cout<<"排序前"<<"\n" ;for(int i=0;i<10;i++){cout<<v[i]<<" ";}sort(v.begin(),v.end(),customLess());cout<<"\n排序后"<<"\n";for(int i=0;i<10;i++){cout<<v[i]<<" ";} 
} 

排序前
10 9 8 7 6 5 4 3 2 1
排序后
1 2 3 4 5 6 7 8 9 10

priority_queue初始化排序规则

priority_queue的cmp函数排序规则和sort()函数一样
优先队列的底层是堆,堆排序的时候,数组的末尾的元素是堆顶。

struct cmp1 {bool operator()(int x, int y) {// //使用>按顺序比较,是降序。return x > y;}
};
struct cmp2 {bool operator()(const int x, const int y) {//使用<按顺序比较,是升序。return x < y;}
};
priority_queue<int, vector<int>, cmp1> q1;  //小根堆
//priority_queue<int, vector<int>, greater<int> > q3;  小根堆, 每次取出的元素是队列中的最小值priority_queue<int, vector<int>, cmp2> q2;  //大根堆
//priority_queue<int, vector<int>, less<int> > q2;  大根堆, 每次取出的元素是队列中的最大值
http://www.jsqmd.com/news/289379/

相关文章:

  • 电商运营必备 多款实用呼叫中心系统推荐
  • Cloudflare SRV记录
  • 凝胶电泳仪/琼脂糖电泳仪选购指南:实力制造商、品牌推荐与性价比全解析
  • Jmeter+influxdb+grafana 性能测试结果监控
  • 一文3000字用Postman从0到1实现UI自动化测试
  • 自动化测试框架搭建全过程
  • 牛批了,流程图工具,免费实用
  • 转转测试环境docker化实践
  • 企业信息化--电子政务
  • 数据分析笔记09:Python条件语循环 - 实践
  • JExten:基于Java模块系统(JPMS)构建健壮的插件架构
  • 2025年上海盐雾试验箱厂商综合实力排行榜单,砂尘试验箱/高低温交变量热试验箱,盐雾试验箱源头厂家口碑推荐榜
  • 全渠道融合能力突出 这些知名呼叫中心品牌值得选
  • 2026山东最新资产评估_房地产评估_股权评估_损失评估_数据资产评估机构首选推荐山东卓越全程土地房地产评估有限公司:山东专业机构,全方位服务值得信赖.
  • 遇到MWORKS建模问题啦?来MoHub帮你快速解决
  • 全方位解析球机摄像头七大核心规格
  • Jmeter性能测试 -3数据驱动实战
  • 基于Java的工厂车辆智慧管理系统的设计与实现全方位解析:附毕设论文+源代码
  • 基于Java的工厂进度智慧管理系统的设计与实现全方位解析:附毕设论文+源代码
  • 基于Java的工厂食堂餐饮智慧管理系统的设计与实现全方位解析:附毕设论文+源代码
  • 市面上常见的呼叫中心系统有哪些 靠谱款盘点可作参考
  • CF1290C Prefix Enlightenment 题解
  • ◆comfyUI教程◆第2章11节 Latent基础与应用控制 - 实践
  • 2026山东最新山东卓越全程土地房地产评估有限公司资产评估_房地产评估_股权评估_损失评估_数据资产评估机构首选推荐:山东专业机构,全方位服务值得信赖.
  • Matlab调用downloadCIFARData和loadCIFARData出错
  • 顶刊中的“水刊”!IEEE Trans系列,含金量拉满,3天初审,中一篇可躺平!
  • springboot基于微信小程序的高校毕业生公考助手管理系统
  • 从黑土到云端,富裕县年货节开启乡村振兴数字新篇
  • 2026年国产控油粉底液专业深度测评:排名前五品牌权威发布
  • mysql二进制日志清理