排序 sort函数的基本用法

来源:互联网 发布:淘宝天猫月销量 编辑:程序博客网 时间:2024/04/29 23:57

 

排序是ACM中经常需要用到的,然而我们需要的效率,冒泡这些排序就算了吧!或许你会写一个快速排序,但再好也没有STL里给你写好了,效率又高的,拿上手就能用的排序方法sort

首先要用sort函数,我们需要这样一个头文件#include<algorithm>

下面我们来一步一步看看这个函数到底是怎么个用法

STLsort函数是这样定义的  sort(begin,end) 或 sort(begin,end,cmp)

begin表示要排序的数组的开头;

end表示要排序的数组的结尾(不包括结尾);

cmp是一个比较策略,可以自己写出所需要的比较策略,cmp这个名字是可以自定义的

当我们使用第一种定义时,也就是不给出比较策略是,是默认升序的;

简单来说:

默认升序对于数字来说,当然是从小到大了,对于字符就是按ASCII码来区分了!

严格点来讲:

是自动调用了'<'的重载函数

我们用一个大小为10的数组arr来举例子吧!

int arr[10]={1,3,5,7,9,2,4,6,8,10};sort(arr,arr+10);  for(int i=0;i<10;i++)    printf("%d ",arr[i]);printf("\n");


默认升序明显是不能满足我们的需要的,那么我们若是想降序呢?

别忘记了我们可以自己写一个比较策略,下面我们来看这个比较策略是怎样写的

bool cmp(int a,int b)   //返回类型一定要bool,比较什么类型,就定义两个什么类型去比较{if(a>b) return true;     //如果a>b,那么我们就返回对,那就把他排前面;else return false;}

 

完整的程序:

bool cmp(int a,int b)  {return a>b;       //这个写法是跟上面的比较策略一样的效果的}int main(){int arr[10]={1,3,5,7,9,2,4,6,8,10};printf("按比较策略cmp得到的结果  :  ");sort(arr,arr+10,cmp);     //3个参数for(int i=0;i<10;i++)printf("%d ",arr[i]);printf("\n");return 0;}


 

当然这样的简单排序不能满足我们的需求,我们或许会用到2级排序3级排序

下面我们来看看二级排序

例:我们需要对一个班里的学生排序,给出的排序策略是先按名字字典序排,若名字一样按年龄小的优先。我们不妨定义一个结构体来实现;

struct Student{char name[10];int age;}student[5];   //定义5个人;bool cmp(Student a,Student b)        //比较策略{if(strcmp(a.name,b.name)==0) return a.age<b.age;    //如果名字相同,返回年龄小的return strcmp(a.name,b.name)== -1;           //否则就返回字典序小的名字}
int main(){strcpy(student[0].name,"tom"),student[0].age=18;   //赋值,写得有点难看strcpy(student[1].name,"lucy"),student[1].age=20;strcpy(student[2].name,"marry"),student[2].age=19;strcpy(student[3].name,"tom"),student[3].age=17;strcpy(student[4].name,"hzt"),student[4].age=20;printf("排序前:\n");for(int i=0;i<5;i++)printf("%-10s %d\n",student[i].name,student[i].age); //这里的%-10s是限定输出10的宽度,左对齐,为了易于分辨而已sort(student,student+5,cmp);printf("\n排序后:\n");for(i=0;i<5;i++)printf("%-10s %d\n",student[i].name,student[i].age);return 0;}


排序后两个人,名字一样,年龄小的在前

 

原创粉丝点击