C++排序
来源:互联网 发布:linux vi命令保存退出 编辑:程序博客网 时间:2024/06/10 19:11
C++ 排序
(使用 Java 的同学可以跳过此页)
C++ 中排序算法函数是sort,在头文件<algorithm>中,你需要在程序开头引入这个头文件,并且加上using namespace std。
sort可以对数组排序:
1
int a[1010] = {2, 4, 3, 1};
2
int n = 4;
3
sort(a, a + n);
上面这份代码对 a[0],a[1],a[2]⋯a[n−1] 进行了排序。sort默认是从小到大排序的。当然,还有一种常见的排序操作是sort(a + m, a + n),对数组a在下标区间(m,n) 上进行排序。
sort也可以对vector排序,实际上sort可以对任何线性容器排序。
1
vector<int> v;
2
v.push_back(2);
3
v.push_back(4);
4
v.push_back(3);
5
v.push_back(1);
6
sort(v.begin(), v.end());
自定义比较函数
(使用 Java 的同学可以跳过此页)
sort除了能对int、double等基础数据类型排序以外,还能对自定义数据类型进行排序,比如结构体类型。不过编译器是不知道如何比较两个结构体类型数据的大小的,所以我们需要给sort传入一个比较器。看下面的例子,我们先定义一个结构体:
1
struct Point {
2
int x, y;
3
} p[4] = {{1, 2}, {1, 0}, {2, 1}, {0, 1}};
现在我想对这些点按照x值从小到大进行排序。我们定义一个比较函数int cmp(Point a, Point b),并把这个函数作为参数传递给sort。
1
int cmp(Point a, Point b) {
2
return a.x < b.x;
3
}
4
int main() {
5
sort(p, p + 4, cmp);
6
return 0;
7
}
上面的代码就是按照x值将p数组从小到大排序,排序后p数组的值是[{0,1},{1,2},{1,0},{2,1}]。如果想要在x值相同的情况下,按照y值从小到大排序,写法如下:
1
int cmp(Point a, Point b) {
2
if (a.x == b.x) {
3
return a.y < b.y;
4
}
5
return a.x < b.x;
6
}
7
int main() {
8
sort(p, p + 4, cmp);
9
return 0;
10
}
上面代码排序以后,p数组的值为[{0,1},{1,0},{1,2},{2,1}]。
自定义比较函数
(使用 C++ 的同学可以跳过本节)
sort除了能对int、Double等基本数据类型或包装类进行排序以外,还能对自定义的类进行排序。
1
class Point implements Comparable {
2
public int x, y;
3
public int compareTo(Object o) {
4
Point p = (Point)o;
5
if (x != p.x) return x - p.x;
6
return y - p.y;
7
}
8
}
9
Point[] p = new Point[3];
10
for (int i = 0; i < 3; ++i) {
11
p[i] = new Point();
12
}
13
p[0].x = 0;
14
p[0].y = 1;
15
p[1].x = 3;
16
p[1].y = 2;
17
p[2].x = 2;
18
p[2].y = 3;
19
Arrays.sort(p); // p => [{0, 1}, {2, 3}, {3, 2}]
要想对一个自定义类的数组进行排序,必须让自定义的类实现Comparable接口,并在类里实现接口的int compareTo(Object o)方法:该方法的返回值为负数时,表示当前对象小于对象o;该方法的返回值为正数时,表示当前对象大于对象o;否则表示当前对象和对象o相等。
大多数时候都不要尝试在比赛中自己实现一个排序算法(除非标准库中的排序算法无法满足需求)。比如有些同学喜欢手写快速排序,但因为自己实现的排序算法往往没有标准库中的算法效率高,还容易写错,既浪费了时间又增大了丢分风险,实在是得不偿失。
(使用 Java 的同学可以跳过此页)
C++ 中排序算法函数是sort,在头文件<algorithm>中,你需要在程序开头引入这个头文件,并且加上using namespace std。
sort可以对数组排序:
1
int a[1010] = {2, 4, 3, 1};
2
int n = 4;
3
sort(a, a + n);
上面这份代码对 a[0],a[1],a[2]⋯a[n−1] 进行了排序。sort默认是从小到大排序的。当然,还有一种常见的排序操作是sort(a + m, a + n),对数组a在下标区间(m,n) 上进行排序。
sort也可以对vector排序,实际上sort可以对任何线性容器排序。
1
vector<int> v;
2
v.push_back(2);
3
v.push_back(4);
4
v.push_back(3);
5
v.push_back(1);
6
sort(v.begin(), v.end());
自定义比较函数
(使用 Java 的同学可以跳过此页)
sort除了能对int、double等基础数据类型排序以外,还能对自定义数据类型进行排序,比如结构体类型。不过编译器是不知道如何比较两个结构体类型数据的大小的,所以我们需要给sort传入一个比较器。看下面的例子,我们先定义一个结构体:
1
struct Point {
2
int x, y;
3
} p[4] = {{1, 2}, {1, 0}, {2, 1}, {0, 1}};
现在我想对这些点按照x值从小到大进行排序。我们定义一个比较函数int cmp(Point a, Point b),并把这个函数作为参数传递给sort。
1
int cmp(Point a, Point b) {
2
return a.x < b.x;
3
}
4
int main() {
5
sort(p, p + 4, cmp);
6
return 0;
7
}
上面的代码就是按照x值将p数组从小到大排序,排序后p数组的值是[{0,1},{1,2},{1,0},{2,1}]。如果想要在x值相同的情况下,按照y值从小到大排序,写法如下:
1
int cmp(Point a, Point b) {
2
if (a.x == b.x) {
3
return a.y < b.y;
4
}
5
return a.x < b.x;
6
}
7
int main() {
8
sort(p, p + 4, cmp);
9
return 0;
10
}
上面代码排序以后,p数组的值为[{0,1},{1,0},{1,2},{2,1}]。
自定义比较函数
(使用 C++ 的同学可以跳过本节)
sort除了能对int、Double等基本数据类型或包装类进行排序以外,还能对自定义的类进行排序。
1
class Point implements Comparable {
2
public int x, y;
3
public int compareTo(Object o) {
4
Point p = (Point)o;
5
if (x != p.x) return x - p.x;
6
return y - p.y;
7
}
8
}
9
Point[] p = new Point[3];
10
for (int i = 0; i < 3; ++i) {
11
p[i] = new Point();
12
}
13
p[0].x = 0;
14
p[0].y = 1;
15
p[1].x = 3;
16
p[1].y = 2;
17
p[2].x = 2;
18
p[2].y = 3;
19
Arrays.sort(p); // p => [{0, 1}, {2, 3}, {3, 2}]
要想对一个自定义类的数组进行排序,必须让自定义的类实现Comparable接口,并在类里实现接口的int compareTo(Object o)方法:该方法的返回值为负数时,表示当前对象小于对象o;该方法的返回值为正数时,表示当前对象大于对象o;否则表示当前对象和对象o相等。
大多数时候都不要尝试在比赛中自己实现一个排序算法(除非标准库中的排序算法无法满足需求)。比如有些同学喜欢手写快速排序,但因为自己实现的排序算法往往没有标准库中的算法效率高,还容易写错,既浪费了时间又增大了丢分风险,实在是得不偿失。
0 0
- 排序(C)
- C排序
- C++------------------------------------------------------------- 排序
- 排序-快速排序(c)
- C/C++--set排序
- 归并排序(C/C++)
- 插入排序(C/C++)
- 【C/C++】排序总结
- 排序算法 - 堆排序 (C++)
- 排序算法 - 快速排序(C++)
- 排序算法 - 计数排序(C++)
- 冒泡排序 & 选择排序 (C++)
- C 插入排序 希尔排序
- C语言排序:冒泡排序
- c语言排序,冒泡排序
- 排序-快速排序(C版本)
- c++-字符串排序-冒泡排序
- 排序算法之冒泡排序(C/C++)
- css3 3d转换之perspective,perspective-origin
- CodeForces 385 D.Bear and Floodlight(状压DP+计算几何)
- 使用Vue.js制作仿Metronic高级表格(一)静态设计
- Spring4.x【入门 what +why +how】
- maven添加jar包
- C++排序
- 回文串算法 Longest Palindromic Substring leetcode
- Android listview显示复杂页面(inflate打气筒,将布局转换成view)
- HTML
- Qt实现简单图形绘制,双缓冲机制和显示SVG格式图片
- 提高篇—统计字符串总共出现多少次数字?
- 【C++学习笔记】for与while
- 在windows 10环境下安装xgboost
- HDFS副本放置节点选择的优化