C的qsort()_C++STL的sort()_priority_queue<Struct, vector<Struct>, 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; 大根堆, 每次取出的元素是队列中的最大值

浙公网安备 33010602011771号