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相等。
大多数时候都不要尝试在比赛中自己实现一个排序算法(除非标准库中的排序算法无法满足需求)。比如有些同学喜欢手写快速排序,但因为自己实现的排序算法往往没有标准库中的算法效率高,还容易写错,既浪费了时间又增大了丢分风险,实在是得不偿失。
0 0
原创粉丝点击