函数原形:
sort(first_pointer,first_pointer+n,cmp)
该函数可以给数组,或者链表list、向量排序。
实现原理:
sort并不是简单的快速排序,它对普通的快速排序进行了优化,此外,它还结合了插入排序和推排序。系统会根据你的数据形式和数据量自动选择合适的排序方法,这并不是说它每次排序只选择一种方法,它是在一次完整排序中不同的情况选用不同方法,比如给一个数据量较大的数组排序,开始采用快速排序,分段递归,分段之后每一段的数据量达到一个较小值后它就不继续往下递归,而是选择插入排序,如果递归的太深,他会选择推排序。
此函数有3个参数:
参数1:第一个参数是数组的首地址,一般写上数组名就可以,因为数组名是一个指针常量。
参数2:第二个参数相对较好理解,即首地址加上数组的长度n(代表尾地址的下一地址)。
参数3:默认可以不填,如果不填sort会默认按数组升序排序。也就是1,2,3,4排序。也可以自定义一个排序函数,改排序方式为降序什么的,也就是4,3,2,1这样。
一、非结构体排序
①升序
#include<iostream>
#include<algorithm>//用使用sort函数必须包含:#include <algorithm>
using namespace std;
int main()
{
int m;
int a[105];
while(cin>>m)
{
for(int i=0;i<m;i++)
cin>>a[i];
sort(a,a+m); //默认升序
for(int i=0;i<m;i++)
cout<<a[i]<<" ";
cout<<endl;
}
}
①降序
#include<iostream>
#include<algorithm>
using namespace std;
int cmp(int a,int b)//如果数组类型的double类型,这里要写 double a ,double b
//返回值类型不要改,写int和bool都行。
{
return a>b;//注意这里是>
}
int main()
{
int m;
int a[105];
while(cin>>m)
{
for(int i=0;i<m;i++)
cin>>a[i];
sort(a,a+m,cmp);// 降序需要自己写一个函数
for(int i=0;i<m;i++)
cout<<a[i]<<" ";
cout<<endl;
}
}
二、结构体排序
#include<iostream>
#include<algorithm>
using namespace std;
struct Person
{
string ID,name,sex,address;
}p[100005];
int cmp(Person A,Person B)//注意传参类型
{
return A.ID<B.ID;//如果对name排序就写 return A.name<B.name;
}
int main()
{
int m;
while(cin>>m)
{
for(int i=0;i<m;i++)
cin>>p[i].ID>>p[i].name>>p[i].sex>>p[i].address;
sort(p,p+m,cmp);//结构体不管升序还是降序都需要自写函数
//说明你想对结构体中哪个成员排序
for(int i=0;i<m;i++)
cout<<p[i].ID<<" "<<p[i].name<<" "
<<p[i].sex<<" "<<p[i].address<<endl;
}
}
三、进阶
分别代表姓名,学号,性别,年龄.
要求:对年龄进行升序排序,如果年龄相同,学号小的在前。
#include<iostream>
#include<algorithm>
using namespace std;
struct Person
{
string name,ID,sex;
int age;
}p[100005];
int cmp(Person A,Person B)
{
if(A.age==B.age)
return A.ID<B.ID;
else
return A.age<B.age;
}
int main()
{
int m;
while(cin>>m)
{
for(int i=0;i<m;i++)
cin>>p[i].name>>p[i].ID>>p[i].sex>>p[i].age;
sort(p,p+m,cmp);
for(int i=0;i<m;i++)
cout<<p[i].name<<" "<<p[i].ID<<" "
<<p[i].sex<<" "<<p[i].age<<endl;
}
}
四、加深记忆
5
1班 张三 20160869108 男 20
2班 李四 20160869101 女 22
3班 王五 20160869103 男 19
2班 赵六 20160869101 女 22
1班 钱七 20160869106 男 19
分别代表姓名,学号,性别,年龄.
要求:对年龄进行升序排序,如果年龄相同,学号小的在前。如果学号相同,班级大的在前
#include<iostream>
#include<algorithm>
using namespace std;
struct Person
{
string banji,name,ID,sex;
int age;
}p[100005];
int cmp(Person A,Person B)
{
if(A.age==B.age)
{
if(A.ID==B.ID)
return A.banji>B.banji;
else
return A.ID<B.ID;
}
else
{
return A.age<B.age;
}
}
int main()
{
int m;
while(cin>>m)
{
for(int i=0;i<m;i++)
cin>>p[i].banji>>p[i].name>>p[i].ID>>p[i].sex>>p[i].age;
sort(p,p+m,cmp);
for(int i=0;i<m;i++)
cout<<p[i].banji<<p[i].name<<" "<<p[i].ID<<" "
<<p[i].sex<<" "<<p[i].age<<endl;
}
}
借鉴:https://www.cnblogs.com/stones-dream/p/10183210.html,作者: 学习随笔记