sort排序

文章介绍了如何利用C++的sort函数对整数数组和结构体数组进行排序,包括基础的整数降序排序和基于结构体的多条件排序。通过自定义比较函数cmp实现排序规则,当总分相同时,按照输入顺序排列。示例代码展示了完整的解决方案。
放弃吧,不会有人给我点小心心的
题目描述

给定N个正整数a1,a2,⋯,an,请输出这N个数从大到小排序后的结果。

输入格式

第一行一个正整数N,代表正整数个数。

第二行N个正整数,表示ai。

输出格式

一行,输出这N个数,从大到小排序后的结果。

样例数据
样例输入1
5
3 9 6 3 4
样例输出1
9 6 4 3 3
数据范围

对于前40%的数据,有1≤N≤1000;

对于前80%的数据,有1≤ai≤100000;

对于100%的数据,有1≤N≤2×1000000,1≤ai≤1000000000。

------------------------------------------------------我是分割线------------------------------------------------------------

这道题,可以用sort排序来解决

sort排序就是c++提供的函数,能自动帮你排序,效率也比什么冒泡快 所以你写什么冒泡,直接sort一下就好了

那么sort怎么用呢?

sort(数组名字+你要排序的第一个下表,数组名字+你要排序的最后一个下表);

例如,我有一个数组a,要排序1到n项,就应该这么写:

sort(a+1,a+n+1);

如果要排序的第一个下标是0(比如我要排序0到n),就应该这么写:

sort(a,a+n)

如果你要排序结构体,就要自己写一个函数

比如这道题:

题目描述

现有 N(N≤100000) 名同学参加了期末考试,并且获得了每名同学的信息:姓名(不超过 8 个字符的仅有英文小写字母的字符串)、语文、数学、英语成绩(均为不超过 150 的自然数)。请根据总分从高到低给所有学生排序。如果有多个总分相同的学生,根据输入的顺序进行输出。

输入格式

输出格式

输入输出样例

输入 #1

3
senpai 80 51 4
lxl 112 10 23
fafa 112 13 20

输出 #1

lxl 112 10 23
fafa 112 13 20
senpai 80 51 4

------------------------------------------------------我是分割线------------------------------------------------------------

这道题的代码是这样的:

#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ll;
ll n;
struct ik {
	string name;
	ll yu,s,yi,sum=0,id;
} a[100050];
int cmp(ik b1,ik b) {
	if(b1.sum!=b.sum) {
		return b1.sum>b.sum;
	} else if(b1.sum==b.sum) {
		return b1.id<b.id;
	}
}
int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin>>n;
	for(ll i=1; i<=n; i++) {
		cin>>a[i].name>>a[i].yu>>a[i].s>>a[i].yi;
		a[i].sum=a[i].yu+a[i].s+a[i].yi;
		a[i].id=i;
	}
	sort(a+1,a+1+n,cmp);
	for(ll i=1; i<=n; i++) {
		cout<<a[i].name<<" "<<a[i].yu<<" "<<a[i].s<<" "<<a[i].yi<<endl;
	}
	return 0;
}

cmp这个函数,相当于是自定义了排序的规则:

如果排序的时候sum不相等,就按sum的大小从大到小排序

要是sum相等,就比较id,id小的排在前面

sort函数默认从小到大排,如果你想从大到小排,你可以写一个cmp函数:

bool cmp(long long a,long long b){
    return a>b;
}


sort(a+1,a+n+1,cmp)

或者这样写:

sort(a+1,a+1+n,greater<int>());

------------------------------------------------------我是分割线------------------------------------------------------------

所以,现在给出AC代码:

#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ll;
ll n;
struct ik{
	string name;ll yu,s,yi,sum=0,id;
}a[100050];
int cmp(ik b1,ik b){
	if(b1.sum!=b.sum){
		return b1.sum>b.sum;
	} else if(b1.sum==b.sum){
		return b1.id<b.id;
	}
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>n;
for(ll i=1;i<=n;i++){
	cin>>a[i].name>>a[i].yu>>a[i].s>>a[i].yi;a[i].sum=a[i].yu+a[i].s+a[i].yi;a[i].id=i;
}sort(a+1,a+1+n,cmp);
for(ll i=1;i<=n;i++){
	cout<<a[i].name<<" "<<a[i].yu<<" "<<a[i].s<<" "<<a[i].yi<<endl;
	
	
	
}

return 0;
}

给了你们也没用,你们又不知道题目在哪里

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值