前言
在实际开发场景中,经常会出现多级排序的需要,例如一个商品,它由字段商品种类 ID,生产日期,保质期组成,要求对多个商品进行排序。
首先以商品种类 ID 升序排序,如果商品种类 ID 相同,则按照生产日期降序排序,如果生产日期也相同,则按照保质期升序排序。
面对上面的场景,在 C++ 中我们可以利用 std::sort
函数来实现,其中 std::sort 的底层是快排算法。
C++ 示例
如下我们定义一个叫做 Data 的结构体,接口体中包含 key1 ~ key3 三个字段,最终实现对 key1 ~ key3 分级的升序排序
typedef struct Data {
int key1{0};
int key2{0};
int key3{0};
} Data;
比较函数,用来作为 std::sort
的第三个参数,指定排序的方式
bool compare(const Data& lhs, const Data& rhs) {
// 首先比较 key1 的大小
if (lhs.key1 != rhs.key1) return lhs.key1 < rhs.key1; // < 表示升序
// 如果两个元素的 key1 相等,则比较 key2
else {
if (lhs.key2 != rhs.key2) return lhs.key2 < rhs.key2;
// 如果两个元素的 key2 相等,则比较 key3
else return lhs.key3 < rhs.key3;
}
}
完整示例
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
typedef struct Data {
int key1{0};
int key2{0};
int key3{0};
} Data;
bool compare(const Data& lhs, const Data& rhs) {
if (lhs.key1 != rhs.key1) return lhs.key1 < rhs.key1;
else {
if (lhs.key2 != rhs.key2) return lhs.key2 < rhs.key2;
else return lhs.key3 < rhs.key3;
}
}
int main() {
Data data1{1,2,3};
Data data2{2,2,4};
Data data3{1,3,5};
Data data4{3,1,3};
Data data5{2,6,1};
vector<Data> dataList{0};
dataList.push_back(data1);
dataList.push_back(data2);
dataList.push_back(data3);
dataList.push_back(data4);
dataList.push_back(data5);
sort(dataList.begin(), dataList.end(), compare);
for (auto data : dataList) {
cout << "key1: " << data.key1 << " key2: " << data.key2 << " key3: " << data.key3 << endl;
}
return 0;
}
输出结果
key1: 1 key2: 2 key3: 3
key1: 1 key2: 3 key3: 5
key1: 2 key2: 2 key3: 4
key1: 2 key2: 6 key3: 1
key1: 3 key2: 1 key3: 3