c++的sort排序(包括结构体)

sort排序

(一)、从小到大:sort()

int arr[]={2,3,4,52,1}
sort(arr,arr+5);

其中括号里面有两个部分,表示从第一个元素arr[0]到第五个元素arr[4]按从小到大的顺序排列

若写为:

sort(arr+i,arr+j)

表示被排序的是arr[i]到arr[j-1],其他元素保持原位置

(二)、从大到小:** greater<数据类型>()**

sort(arr,arr+5,greater<int>());

(三)、自定义一种从大到小排序的方法:cmp

bool cmp(int x,int y)
{
	return x>y;
}
int main(){
	int arr[10];
	for(int i=0;i<10;i++)
	{
		cin>>arr[i];
	}
	sort(arr,arr+10,cmp);
	//如果cmp返回结果为假, 那么函数就会将他们互换位置;
	//如果cmp返回结果为真,就会保持原来位置不变。
	
	//此时返回值为假
}

例题:
题意:有N个正整数,均小于10000,现在要将这些正整数按照除以3的余数从小到大排序,即除以3余0的数排在余1的数前面,余1在余2前面,如果余数相同,则按找正整数的值从小到大排序

输入格式:
第一行:N,0 第二行:N个正整数,用空格隔开

#include
using namespace std;
int num[105];//在全局定义数组 
bool cmp(int x,int y)
{
	if(x%3==y%3)//余数相同时 
	{
		return x<y;
	}
	else//余数不同时 
	{
		return x%3 <y%3;
	}
}

int main()
{
	int N;
	cin>>N;
	for (int i=0;i<N;i++)
	{
		cin>>num[i];
	}
	sort(num,num+N,cmp);
	//输出 
		for (int i=0;i<N;i++)
	{
		//末尾数不输出空格 
		if(i!=N-1)
		{
			cout<<num[i]<<' ';	
		}
		else
		{
			cout<<num[i]<<endl;
		 } 
		
	}
	return 0;
}

(三)、sort对结构体进行排序

1、首先初始化结构体,即对结构体赋值
原来的做法是一个一个赋值:如下

Student stu;
int score_input;
string name_input;
cin>>score_input>>name_input;
stu.name=name_input;
stu.score=score_input;

可以看到,以上手动给结构体赋值的很麻烦的

改进,用构造函数法,在结构体内进行赋值

struct Student{
	int score;
	string name;
	Student(string n,int s)
	{
		name=n;
		score=s;
	}
};

注意
1、函数名要和结构体名完全相同
2、不能定义返回值类型,也不能有return语句
3、有无形参都,圆括号()内可以为空
4、,当构造函数的花括号里面没有参数,是空的时候称为默认构造函数,只能出现一个默认构造函数
5、竞赛中一般是采用初始化列表的方式:
Student (string n, int s):name(n),score(s){}
其中,花括号不能省略
不需要手动调用,当创建结构体的时候,构造函数会自动被调用

例子如下:

#include
using namespace std;
struct Student
{
	int score;
	string name;
	//不要忘了默认构造函数,并且一下两行都不用分号; 
	Student(){} 
	Student(string n,int s):name(n),score(s){}
 } ;
 
 int main()
 {
 	Student stu[3];
 	for(int i=0;i<3;i++)
 	{
 		int s;
 		string n;
 		cin>>n>>s; //字符串也可以cin>>来输出 
 		stu[i]=Student(n,s);
	 }
	 for(int i=0;i<3;i++)
	 {
	 	cout<<stu[i].name<<' '<<stu[i].score<<endl;
	 }
	 
 }

c++的sort排序(包括结构体)_第1张图片

接下来按姓名来排序,三名同学,四门成绩

#include
using namespace std;
struct Student
{
	int score[4];
	string name;
 } ;
 //按照名字排序,从小到大, 
 bool cmp(Student x,Student y){
 	return x.name<y.name;
 } 
 int main()
 {
 	Student stu[3];
 	for(int i=0;i<3;i++)
 	{
 		cin>>stu[i].name;
 		for(int j=0;j<4;j++)
 		{
 			cin>>stu[i].score[j];
		}
	 }
	 sort(stu,stu+3,cmp);
	 for(int i=0;i<3;i++)
	 {
	 	cout<<stu[i].name<<':';
	 	for(int j=0;j<4;j++)
	 	{
	 		cout<<stu[i].score[j]<<' ';
		 }
		 cout<<endl; 
	 }
	 return 0;
 }

c++的sort排序(包括结构体)_第2张图片

接下来按每门成绩从大到小排序

#include
using namespace std;
struct Student
{
	int score[4];
	string name;
 } ; 
 bool cmp(Student x,Student y){
 	//这里不用else是因为一进来就return了! 
 	if(x.score[0]!=y.score[0])
	 {
	 	return x.score[0]>y.score[0];
	  } 
	   	if(x.score[1]!=y.score[1])
	 {
	 	return x.score[1]>y.score[1];
	  } 
	   	if(x.score[2]!=y.score[2])
	 {
	 	return x.score[2]>y.score[2];
	  } 
	   	if(x.score[3]!=y.score[3])
	 {
	 	return x.score[3]>y.score[3];
	  } 
 } 
 int main()
 {
 	Student stu[3];
 	for(int i=0;i<3;i++)
 	{
 		cin>>stu[i].name;
 		for(int j=0;j<4;j++)
 		{
 			cin>>stu[i].score[j];
		}
	 }
	 sort(stu,stu+3,cmp);
	 for(int i=0;i<3;i++)
	 {
	 	cout<<stu[i].name<<':';
	 	for(int j=0;j<4;j++)
	 	{
	 		cout<<stu[i].score[j]<<' ';
		 }
		 cout<<endl; 
	 }
	 return 0;
 }

c++的sort排序(包括结构体)_第3张图片

接下来将两种方式整合

#include
using namespace std;
struct Student
{
	int score[4];
	string name;
 } ; 
 //按照比较名字的方法排序
 bool cmp_name(Student x,Student y)
 {
 	return x.name<y.name;
 }
 bool cmp_score(Student x,Student y){
 	//这里不用else是因为一进来就return了! 
 	if(x.score[0]!=y.score[0])
	 {
	 	return x.score[0]>y.score[0];
	  } 
	   	if(x.score[1]!=y.score[1])
	 {
	 	return x.score[1]>y.score[1];
	  } 
	   	if(x.score[2]!=y.score[2])
	 {
	 	return x.score[2]>y.score[2];
	  } 
	   	if(x.score[3]!=y.score[3])
	 {
	 	return x.score[3]>y.score[3];
	  } 
 } 
 int main()
 {
 	Student stu[3];
 	for(int i=0;i<3;i++)
 	{
 		cin>>stu[i].name;
 		for(int j=0;j<4;j++)
 		{
 			cin>>stu[i].score[j];
		}
	 }
	 //name
	 sort(stu,stu+3,cmp_name);
	 for(int i=0;i<3;i++)
	 {
	 	cout<<stu[i].name<<':';
	 	for(int j=0;j<4;j++)
	 	{
	 		cout<<stu[i].score[j]<<' ';
		 }
		 cout<<endl; 
	 }
	 
	 
	//score
	sort(stu,stu+3,cmp_score);
	 for(int i=0;i<3;i++)
	 {
	 	cout<<stu[i].name<<':';
	 	for(int j=0;j<4;j++)
	 	{
	 		cout<<stu[i].score[j]<<' ';
		 }
		 cout<<endl; 
	 }
	 return 0;
 }


c++的sort排序(包括结构体)_第4张图片

你可能感兴趣的:(c++的sort排序(包括结构体))