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;  大根堆, 每次取出的元素是队列中的最大值
posted @ 2026-01-23 16:06  sunrise0307  阅读(3)  评论(0)    收藏  举报