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<101;
第二行:N个正整数,用空格隔开

#include<bits/stdc++.h>
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<bits/stdc++.h>
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;
	 }
	 
 }

在这里插入图片描述

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

#include<bits/stdc++.h>
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;
 }

在这里插入图片描述

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

#include<bits/stdc++.h>
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;
 }

在这里插入图片描述

接下来将两种方式整合

#include<bits/stdc++.h>
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;
 }


在这里插入图片描述

  • 18
    点赞
  • 67
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++sort函数可以用于对结构体进行排序。在使用sort函数之前,我们需要定义一个比较函数,该函数用于指定排序的方式。 在引用中的示例代码中,我们可以看到cmp_函数被定义为sort函数的比较函数。该函数接受两个Book类型的参数a和b,并根据它们的num成员变量进行比较。如果a的num大于b的num,则返回true,否则返回false。 在引用中的示例代码中,我们可以看到结构体student被定义为一个学生类型的结构体。我们可以使用该结构体来定义变量a和b。 因此,要使用sort函数对结构体进行排序,我们需要定义一个比较函数,并在sort函数中指定该比较函数。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [c++ qsortsort结构体排序实例代码](https://download.csdn.net/download/weixin_38635449/14839177)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [c++结构体sort超详细用法](https://blog.csdn.net/Jerry_qbw/article/details/125082100)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值