笔记90:C++中sort函数的使用

函数原型:sort ( iterator beg , iterator end , _Pred )

a

a

参数介绍:

  • beg:起始迭代器
  • end:终止迭代器
  • Pred:谓词(如果不给,默认使用 less<int>() 作为谓词,排序方式为从小到大)

a

a

作用:将迭代器beg和end之间的元素进行排序

a

a

注意1:使用之前包含头文件 <functional>,这个函数不是STL中定义的;

注意2:如果用STL中定义的针对某个容器类型的sort函数,则要包含头文件 <algorithm>;

注意3:定义的比较函数一定要加关键字【static】;

注意4:排序函数内部实现为快排,排序的时间复杂度为 O(n * logn) ;

a

a

补充文章:

https://www.cnblogs.com/BlueBlueSea/p/14030217.html

C++中sort()函数第三个参数(比较函数)为什么要声明为 static?-CSDN博客

不想自己编写排序函数,可以直接使用已经定义好的仿函数:

a

a

如果想对容器中的元素从小到大排序:

  1. sort ( iterator beg , iterator end )
  2. sort ( iterator beg , iterator end , less<int>() )

如果想对容器中的元素从大到小排序:

  1. sort ( iterator beg , iterator end , greater<int>() )

如何编写排序函数:

举例1:

例1:Leetcode_1005_K次取反后最大化的数组和

链接:. - 力扣(LeetCode)

class Solution {
static bool PaiXv(int a, int b) {
    return abs(a) > abs(b);
}

public:
    int largestSumAfterKNegations(vector<int>& nums, int k) {
        sort(nums.begin(), nums.end(), PaiXv);

        for (int i = 0; i < nums.size(); i++) {
            if (nums[i] < 0 && k > 0) {
                nums[i] *= -1;
                k--;
            }
        }
        if (k % 2 == 1) nums[nums.size() - 1] *= -1;

        int result = 0;
        for (int a : nums) result += a;
        return result;
    }
};

注意1:代码中定义的排序是从大到小

注意2:数值a和b都是按照数组nums中元素原本的顺序传递进来的,如果想让其从大到小排列,就需要这么写;如果a和b确实是按照从大到小排列的,就返回true,否则就返回false;

举例2:

例2:Leetcode_406_根据身高体重建队列

链接:. - 力扣(LeetCode)

class Solution {
public:
    static bool compare(vector<int> v1, vector<int> v2) {
        if(v1[0] > v2[0]) return true;
        else if(v1[0] == v2[0] && v1[1] < v2[1]) return true;

        return false;
    }

    vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
        sort(people.begin(), people.end(), compare);
        vector<vector<int>> result;
        result.push_back(people[0]);
        
        for(int i = 1; i < people.size(); i++) {
            result.insert(result.begin() + people[i][1], people[i]);
        }
        return result;
    }
};

注意:代码中定义的排序顺序是先按首元素排序,首元素相同则按次元素排序;

  • 排序前:people = [ [7,0] , [4,4] , [7,1] , [5,0] , [6,1] , [5,2] ]
  • 排序后:people = [ [7,0] , [7,1] , [6,1] , [5,0] , [5,2] , [4,4] ]

举例3:

例3:Leetcode_56_合并区间

链接:. - 力扣(LeetCode)

class Solution {
public:
    static bool compare(vector<int> a, vector<int> b) {
        if(a[0] < b[0]) return true;
        else if(a[0] == b[0] && a[1] < b[1]) return true;
        return false;
    }

    vector<vector<int>> merge(vector<vector<int>>& intervals) {
        //自己尝试:贪心算法

        //排序:
        sort(intervals.begin(), intervals.end(),compare);

        //合并区间:
        vector<vector<int>> result;
        int start_pos = intervals[0][0];
        int end_pos = intervals[0][1];

        for(int i = 1; i < intervals.size(); i++) {
            if(intervals[i][0] <= end_pos) end_pos = max(end_pos, intervals[i][1]);
            else {
                result.push_back(vector<int>{start_pos, end_pos});
                start_pos = intervals[i][0];
                end_pos = intervals[i][1];
            }
        }
        result.push_back(vector<int>{start_pos, end_pos});

        return result;
    }
};

注意:代码中定义的排序顺序是先按首元素排序,首元素相同则按次元素排序;

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值