常用的排序方式包括快排、归并排序、堆排序等。
其中,快速排序对于C++来说,可以很方便使用函数qsort、sort对目标序列进行排序。
基本快速排序的方法,每次把数组分成两分和中间的一个划分值,而对于有多个重复值的数组来说,基本排序的效率较低。集成在C语言库函数里面的的qsort函数,使用三路划分的方法解决这个问题。所谓三路划分,是指把数组划分成小于划分值,等于划分值和大于划分值的三个部分。
int cmp1(const void *a, const void *b)
{
if ((*(vector<int>*)a)[0] == (*(vector<int>*)b)[0] ) {
return (*(vector<int>*)a)[1] < (*(vector<int>*)b)[1]; // 从大到小排序
}
else
return (*(vector<int>*)a)[0] > (*(vector<int>*)b)[0]; // 从小到大排序
}
int paixu(vector<vector<int>>& envelopes) {
qsort(&envelopes[0], envelopes.size(), sizeof(vector<int>(2)), cmp1);
for (auto i : envelopes)
cout << i[0] << ' ' << i[1] << ' ' << endl;
return dp.size() - 1;
}
sort是qsort的升级版,如果能用sort尽量用sort,使用也比较简单,不像qsort还得自己去写 cmp 函数,只要注明 使用的库函数就可以使用,参数只有两个(如果是普通用法)头指针和尾指针;
默认sort排序后是升序,如果想让他降序排列,可以使用自己编的cmp函数
注意:sort函数的cmp必须定义为全局域上,在类内会报错。
// 自定义方法一
sort(envelopes.begin(), envelopes.end(), [](const auto& e1, const auto& e2) {
return e1[0] < e2[0] || (e1[0] == e2[0] && e1[1] > e2[1]);
});
// 自定义方法二
bool compare(int a,int b)
{
return a>b; //降序排列,如果改为return a<b,则为升序
}
sort(*a,*b,cmp);