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

时间:2024-05-31 10:44:16

函数原型: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?-****博客

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

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] ]