sort排序

函数原形:

sort(first_pointer,first_pointer+n,cmp)

该函数可以给数组,或者链表list、向量排序。

实现原理:

sort并不是简单的快速排序,它对普通的快速排序进行了优化,此外,它还结合了插入排序和推排序。系统会根据你的数据形式和数据量自动选择合适的排序方法,这并不是说它每次排序只选择一种方法,它是在一次完整排序中不同的情况选用不同方法,比如给一个数据量较大的数组排序,开始采用快速排序,分段递归,分段之后每一段的数据量达到一个较小值后它就不继续往下递归,而是选择插入排序,如果递归的太深,他会选择推排序。

此函数有3个参数:

参数1:第一个参数是数组的首地址,一般写上数组名就可以,因为数组名是一个指针常量。

参数2:第二个参数相对较好理解,即首地址加上数组的长度n(代表尾地址的下一地址)。

参数3:默认可以不填,如果不填sort会默认按数组升序排序。也就是1,2,3,4排序。也可以自定义一个排序函数,改排序方式为降序什么的,也就是4,3,2,1这样。

一、非结构体排序

!](https://img-blog.csdnimg.cn/20191227173634379.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzE4ODQxNzYx,size_16,color_FFFFFF,t_70)

①升序
#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,作者: 学习随笔记

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值