ACM tips 之 排序 sort

来源:互联网 发布:unity3d工程师工资 编辑:程序博客网 时间:2024/05/29 16:29

        在ACM解题过程中,经常碰到排序问题,刚接触的人可能会自己去写排序,不仅是为了熟悉算法的思想,也是为了练习写代码的能力。但熟悉了之后就不需要在自己写了,调用c++的库就好了。接下来进入正题。介绍几个简单的方法。
        这篇文章知识简单的提了一下排序函数的调用,还有很多其他的内容,如:稳定排序。希望看完之后可以自己扩展阅读。我在最后贴了一个链接。后续我会继续更新。

数组排序:

    // 初始化数组    int a[10] ={23,32,54,12,52,56,8,30,44,94};    int len = 10;    // 排序方法    sort(a,a+len);    // 显示    for(int i=0; i<len; ++i)        printf("%d ",a[i]);    printf("\n");    //结果 8 12 23 30 32 44 52 54 56 94



        sort函数的头文件,必须要#include<algorithm>,第一个参数是要排序数组的开头,第二个参数是最后一个数字的下一个位置。如果数组的下标从1开始的话就是:sort(a+1,a+1+len)而排序的结果是按照从小到大排序的。

如果要想从大到小排序,需要自己写排序的函数,作为sort函数的第三个参数传进去,

    // 排序规则定义,从大到小    bool cmp(const int &a, const int &b){        return a>b;    }    // 初始化数组    int a[10] ={23,32,54,12,52,56,8,30,44,94};    int len = 10;    // 排序     这里加上了第三个参数    sort(a,a+len,cmp);    // 显示    for(int i=0; i<len; ++i)        printf("%d ",a[i]);    printf("\n");    //结果 94 56 54 52 44 32 30 23 12 8



        函数的写法,一定要就加上const&修饰。比较函数体写法:第一个参数小于第二个参数,就是升序;第一个参数大于第二个参数就是降序「是不是很好记 ^-^」。


结构体数组排序

结构体排序有两种方法,一种和数组的排序类似,如。

    // 结构体定义    struct Node{        int x;        int y;        int z;        Node(){x=0; y=0; z=0;}    };    // 定义结构体数组    Node a[10];    /*       函数的排序规则和数组排序的一样,对应第一个参数和第二个参数。
函数说明: 首先按照x升序排序, 如果x相同了就按照y降序排序, 如果y相同了就按照z升序排序。 */ bool cmp(const Node &a, const Node &b){ if(a.x!=b.x) return a.x<b.x; else if(a.y!=b.y) return a.y>b.y; else return a.z<b.z; } // 排序函数调用 sort(a,a+len,cmp);



另一种就是在结构体里定义排序规则,重载符号操作符。

    // 结构体定义    struct Node{        int x;        int y;        int z;        Node(){x=0; y=0; z=0;}        // 排序规则定义,同样b代表第二个参数,意义同前。        bool operator < (const Node &b)const{            if(x!=b.x)                return x<b.x;            else if(y!=b.y)                return y>b.y;            else return z<b.z;        }    };    Node a[10];    // 排序方法    sort(a,a+len);    //这里同样适用sort(a+1,a+1+len),这种写法。


STL排序

STL排序也有两种,一种还是写排序函数,适用于容器在装元素的时候无序装载,排序需要调用sort函数排序。如:vector。

    // 结构体定义    struct Node{        int x;        int y;        int z;        Node(){x=0; y=0; z=0;}    };    // 定义排序函数    bool cmp(const Node &a, const Node &b){        if(a.x!=b.x)            return a.x<b.x;        else if(a.y!=b.y)            return a.y>b.y;        else return a.z<b.z;    }    // 变量声明    vector<Node> vet;    // 排序调用    sort(vet.begin(),vet.end(),cmp);



另一种适用于在容器装载元素的时候就是按照顺序装载的。如set,这种需要自己重载操作符。

    // 结构体定义    struct Node{        int x;        int y;        int z;        Node(){x=0; y=0; z=0;}    };    // 排序结构体定义    struct cmp{        bool operator ()(const Node &a, const Node &b){            if(a.x!=b.x)                return a.x<b.x;            else if(a.y!=b.y)                return a.y>b.y;            else return a.z<b.z;        }    };    // 变量定义和声明,在插入的时候会自动排序    set<Node, cmp> sets;


扩展阅读:
http://www.cnblogs.com/BeyondAnyTime/archive/2012/05/26/2519492.html

0 0
原创粉丝点击