结构体排序+sort()

8 篇文章 0 订阅
6 篇文章 1 订阅

目录

1.结构体定义

2.sort排序

1.sort()函数的头文件和用法举例

2.sort()函数的参数说明

两个参数

 三个参数

3.结构体排序


1.结构体定义

结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合,也叫结构。

通俗的来说其实就是,开辟一个新的变量来存储这个变量的不同属性,比如,学生成绩,它有语数外三科成绩,因为这三科成绩属于同一个人。

struct student{
    int Ch;//语文
    int math;//数学
    int En;//英语
}p[10000];

后面是一个可选的标志(p),它是用来引用该结构体的快速标记.

这里的我开了一个大小为10000的数组,表示开辟了一个可以存下10000个学生成绩那么大的结构体数组。

2.sort排序

结构体排序,我这里介绍调用sort函数的这一种排序;

1.sort()函数的头文件和用法举例

首先要调用sort函数,一定要加上这个头文件  #include<algorithm>

其实就和你要调用pow()函数一定要加上#include<cmath>头文件一个道理

用法举例如下:

#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
   int a[5]={1,4,6,3,2};
   sort(a,a+5);
   for(int i=0;i<5;i++)
     cout<<a[i]<<" ";
   cout<<endl;
   return 0;
}

输出结果如下: 

2.sort()函数的参数说明

sort函数可以是两个参数,也可以是三个参数,这里我们先介绍两个参数的那种情况,在介绍三个参数的情况;

两个参数

也就是sort函数没有第三个参数,这种情况就是,默认实现的是从小到大,也就是刚刚举例的那种情况

#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
 int a[10]={9,6,3,8,5,2,7,4,1,0};
 for(int i=0;i<10;i++)
   cout<<a[i]<<" ";//打印排序之前的数组序列
   cout<<endl;
 sort(a,a+10);//这里调用sort()函数
 for(int i=0;i<10;i++)
   cout<<a[i]<<" ";//打印排序之后的数组序列
 return 0;
}

 三个参数

Sort函数有三个参数:

(1)第一个是要排序的数组的起始地址。

(2)第二个是结束的地址(最后一位要排序的地址)

(3)第三个参数是排序的方法,可以是从大到小也可是从小到大,还可以不写第三个参数,此时默认的排序方法是从小到大排序。

【注意】这里的第三个参数就是自己定义的比较方式的函数,比如下面的例子我定义的函数名字是cmp,(是bool类型),我这个函数返回的是 a>b,所以这里调用了sort之后数组里的元素按照从小到大的顺序排列

Sort函数使用模板:

Sort(start,end,排序方法)

代码如下:自己可以尝试一下写一个类似的代码,运行一下:哈哈哈👀ヾ(•ω•`)oヾ(•ω•`)o

#include<iostream>
#include<algorithm>
using namespace std;
bool cmp(int a,int b)
{
	return a>b;
 } 
int main() {
	int a[10]= {9,6,3,8,5,2,7,4,1,0};
	cout<<"最原始的数组:"; 
	for(int i=0; i<10; i++)
		cout<<a[i]<<" ";
    cout<<endl;
	    sort(a,a+10,cmp);
	cout<<"调用三个参数sort()函数排序后的数组:";
	for(int i=0; i<10; i++)
		cout<<a[i]<<" ";
    cout<<endl;
    sort(a,a+10);
    cout<<"调用两个参数sort()函数排序后的数组:";
	for(int i=0; i<10; i++)
		cout<<a[i]<<" ";
	return 0;
}

输出结果:

3.结构体排序

之前说的结构体,就是包含了多个元素的变量,,然后,,,这里讲到的sort函数就是对数组里面的元素进行排序,那么如果这是一个结构体数组,我们也可以用sort函数,对这个结构体数组进行类似的操作了

来看个题目吧:
某小学打算为学习成绩优秀的前5名学生发奖学金。期末,每个学生都有3门课的成绩:语文、数学、英语。总分从高到低排序,如果两个同学总分相同,语文成绩从高到低排序,如果两个同学总分和语文成绩都相同,那么规定学号小的同学 排在前面,这样,每个学生的排序是唯一确定的。
任务:先根据输入的3门课的成绩计算总分,然后按上述规则排序,最后按排名顺序输出前五名名学生的学号和总分。注意,在前5名同学中,每个人的奖学金都不相同,因此,你必须严格按上述规则排序。例如,在某个正确答案中,如果前两行的输出数据(每行输出两个数:学号、总分) 是:
7 279
5 279
这两行数据的含义是:总分最高的两个同学的学号依次是7号、5号。这两名同学的总分都是 279 (总分等于输入的语文、数学、英语三科成绩之和) ,但学号为7的学生语文成绩更高一些。如果你的前两名的输出数据是:
5 279
7 279
则按输出错误处理,不能得分。

传送门:查看完整题目

看完题目得知,这里有很多个学生,每个学生有自己的 三门成绩,语数英,还有学号,那我们得定义一个结构体数组,把每个学生的这些信息储存起来,再按照规定进行排序,输出前五名就是我们要完成的任务

话不多说,上代码:

#include<iostream>
#include<algorithm>
using namespace std;
struct student{
    int c;//语文分数
    int s;//数学分数
    int y;//英语分数
    int num;//学号
    int sum;//每个人的总分
}p[500];
bool cmp(const student&a,const student&b)
{
    if(a.sum!=b.sum)//如果总分不相同,就返回总分高的那一个
        return a.sum>b.sum;
    else if(a.sum==b.sum&&a.c!=b.c)//如果总分相同,就返回总分语文高的那一个
        return a.c>b.c;
    else if(a.sum==b.sum&&a.c==b.c&&a.num!=b.num)
//如果总分相同,语文分相同,就返回总分学号小的那一个
        return a.num<b.num;
}
int main()
{
    int n;
    cin>>n;
    for(int i=0;i<n;i++)
        {
        	cin>>p[i].c>>p[i].s>>p[i].y;//输入信息                                           
        	p[i].num=i+1;//序号即学号
        	p[i].sum=p[i].c+p[i].s+p[i].y;//算出每个人的总分
		}
    sort(p,p+n,cmp);//排序
    for(int i=0;i<5;i++)//输出前五名的学号和总分
        cout<<p[i].num<<" "<<p[i].sum<<endl;
    return 0;
}

这样就可以完成任务了。

拿去吧,去给皇上看,你告诉他,这都是本宫自己敲的,没有假手于人,本宫手都要断了。

ಥ_ಥ

  • 100
    点赞
  • 327
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 16
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Andy℡。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值