首页 > 代码库 > 结构体排序

结构体排序

经常碰到结构体排序的问题,在此总结一下。
以一个简单的例题开始:

例1、有三个人(Person结构体),每个人都有name(string型)和age(int型)两个属性,现在需要按照下面的规则排序:先以姓名按从小到大排序(如abc<abd),如果姓名相同,则按照年龄从大到小排序。

#include<iostream>#include<string>using namespace std;struct Person{    string name;    int age;};void exchange(Person &a,Person &b){    //注意交换的时候,中间变量是结构体类型,而不是基本数据类型(int,char,string)等。    Person temp;    temp=a;    a=b;    b=temp;}int main(){    Person p[3];    int i,j;    for(i=0;i<3;i++){        cin>>p[i].name>>p[i].age;    }    //冒泡排序实现    for(i=0;i<3;i++){        for(j=0;j<3-i-1;j++){            if(p[j].name<p[j+1].name){                exchange(p[j],p[j+1]);            } else if(p[j].name==p[j+1].name){                if(p[j].age<p[j+1].age){                    exchange(p[j],p[j+1]);                }            }        }    }    //依次输出    for(i=0;i<3;i++){        cout<<p[i].name<<‘ ‘<<p[i].age<<endl;    }}

 这个代码是我最初写的,毫无技术含量,参加过ACM或者程序竞赛的朋友一看就知道这样做太复杂,因为有一个简单的sort函数,只要一行代码即可实现。

sort函数首先是一个排序函数,不仅可以用来给数字排序,还可以给字符串排序,默认的是升序,如果需要降序的话,可以自己写一个函数cmp函数(函数名可自拟,通常用cmp),然后在sort函数中,加上(cmp)函数名即可。

例2、随机产生10个数,并且从大到小输出

#include<iostream>#include<algorithm>#include<cstdlib>bool cmp(int a,int b){    return a>b;}using namespace std;int main(){    int A[10],i;    for(i=0;i<10;i++){        A[i]=rand();    }    sort(A,A+10,cmp);    for(i=0;i<10;i++){        cout<<A[i]<<‘ ‘;    }}

 注意:使用sort函数,必须要加#include<algorithm>头文件。在sort函数中,第一个参数为数组(字符串)名,第二个参数为排序范围,是从A到A+n(n为长度),第三个参数可省,省略后则代表默认升序,加上自己写的cmp函数,即可按照cmp中的规定进行排序。

既然sort函数这么神奇,那他肯定也是可以对结构体或者对象进行排序的。

结构体排序