介绍: sort就是快速排序,是稳定的排序,所谓稳定就是如果原数组中存在 a =b ,排序后a,b的相对位置不变,最坏时间复杂度为nlog(n),是acmer的基本技能

 学会用stl里面的sort,包括头文件和比较函数cmp的多种写法

http://blog.csdn.net/jiary5201314/article/details/8170217

了解vector容器,知道怎样用vector

http://blog.csdn.net/phoebin/article/details/3864590(了解怎样插入元素,清空元素,以及头文件,定义即可)

了解less和greater

http://www.cppblog.com/mzty/archive/2005/12/15/1770.html

理解以下代码:

vector < int > vect;
//...
sort(vect.begin(), vect.end());

sort(vect.begin(), vect.end(), less<int>() );

总结:学习sort,要学习数组的sort和 vector容器的sort ,这两种方式都会了就可以了

参考代码:

请自行了解结构体的相关用法:

http://blog.csdn.net/xiaoyali/article/details/4393486

比如有以下信息,现在要对相关信息排序

变量名 类型 意义
id int 队伍编号
num int 幸运数字
name 字符串 队名
cls 字符串 班级名

 

 

 

 

 

 比较函数写法参考代码:

bool cmp_num(ss x,ss y)//幸运数字从小到大排序
{
    return x.num<y.num;
}
bool cmp_name(ss x,ss y)//队名从按照字典序排序
{
    return strcmp(x.name,y.name)<0;
}
bool cmp_num_name_cls(ss x,ss y)//先按幸运数字从小到大排,如果一样再按队名字典序排,如果还是一样,按照班级名字典序排
{
    if(x.num==y.num)
    {
        if(strcmp(x.name,y.name)==0)
        {
            return strcmp(x.cls,y.cls)<0;
        }
        return strcmp(x.name,y.name)<0;
    }
    return x.num<y.num;
}

完整代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define N 100010
struct ss
{
    int num;
    char name[20];
    char cls[20];
}a[N];
bool cmp_num(ss x,ss y)
{
    return x.num<y.num;
}
bool cmp_name(ss x,ss y)
{
    return strcmp(x.name,y.name)<0;
}
bool cmp_num_name(ss x,ss y)
{
    if(x.num==y.num)return strcmp(x.name,y.name)<0;
    return x.num<y.num;
}
bool cmp_num_name_cls(ss x,ss y)
{
    if(x.num==y.num)
    {
        if(strcmp(x.name,y.name)==0)
        {
            return strcmp(x.cls,y.cls)<0;
        }
        return strcmp(x.name,y.name)<0;
    }
    return x.num<y.num;
}
int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        int i;
        for(i=0;i<n;i++)
        {
            scanf("%d%s%s",&a[i].num,a[i].name,a[i].cls);
        }
        sort(a,a+n,cmp_num_name_cls);
        printf("%-10s%-10s%-20s%-20s\n","编号","幸运数字","队名","班级");
        for(i=0;i<n;i++)
        {
            printf("%-10d%-10d%-20s%-20s\n",i+1,a[i].num,a[i].name,a[i].cls);
        }
    }
    return 0;
}
/*
10
7    你猜                计算机科学与技术
9    你猜我猜不猜        医学信息工程
4    XXXXXL              医学信息
5    名字长长长才能AC    计算机
7    楼上等我            医信
11    这游戏真难          听力
2    求不坑                管理
5    名字长长长才能AC    计算机科学与技术
10    DLROWOLLEH          大医信
11    念来过倒要字名      计算机

5
3   abc     aaa
3   abcd    accc
4   fbi     sss
3   ddd     66666
7   gs      77s
*/

 

题目练习:

http://www.patest.cn/contests/pat-a-practise/1028

 

posted on 2015-03-15 22:55  kylehz  阅读(178)  评论(0)    收藏  举报