C/C++中sort方法-自定义排序规则
sort中直接定义排序规则
题目:我们有一个由平面上的点组成的列表 points。需要从中找出 K 个距离原点 (0, 0) 最近的点。
(这里,平面上两点之间的距离是欧几里德距离。)
你可以按任何顺序返回答案。除了点坐标的顺序之外,答案确保是唯一的。
class Solution {
public:
vector<vector<int>> kClosest(vector<vector<int>>& points, int K) {
vector<vector<int>> ret;
if (K >= points.size())
return points;
//计算点到原点的距离,将其存入原数组points下标2位置
for (auto &p: points)
p.push_back(p[0]*p[0]+p[1]*p[1]);
//依据下标2,也就是x*x+y*y的值进行排序。
sort(points.begin(), points.end(),
[](vector<int> &a, vector<int> &b){ return a[2] < b[2]; });
for (int i = 0; i < K; i++)
ret.push_back({points[i][0], points[i][1]});
return ret;
}
};
对结构体进行排序
实现此功能有两种方法,一是在sort方法中传入比较器,二是结构体内重写operator < 方法。这两种方法实现起来都很简单,下面举例说明。
题目:一个班有若干名学生,已知学生的学号(id)和年龄(age),请你编写一个程序对该班的学生根据年龄进行排序。
在sort方法中传入比较器
代码:
#include<vector>
#include<algorithm>
#define NUM 10
using namespace std;
//自定义结构体的排序
struct Student {
int id;
int age;
};
vector<Student> stus;
bool cmd(Student a, Student b) {
if (a.age < b.age)
return true;
return false;
}
void main() {
for (int i = 0; i < NUM; i++) {
Student s;
s.id = i;
s.age = rand() % 30;
stus.push_back(s);
}
sort(stus.begin(),stus.end(),cmd);
for (int i = 0; i < NUM; i++) {
printf("student NO %d,age : %d\n",i,stus[i].age);
}
system("pause");
}
结构体内重写operator < 方法
代码:
#include<vector>
#include<algorithm>
#define NUM 10
using namespace std;
//重写operator < 方法
struct Student {
int id;
int age;
bool operator < (const Student s) {
return age < s.age;
}
};
vector<Student> stus;
void main() {
for (int i = 0; i < NUM; i++) {
Student s;
s.id = i;
s.age = rand() % 30;
stus.push_back(s);
}
sort(stus.begin(), stus.end());
for (int i = 0; i < NUM; i++) {
printf("student NO %d,age : %d\n", i, stus[i].age);
}
system("pause");
}