排序(C++)

sort()函数的用法

sort(首元素地址(必填),尾元素地址的下一个地址(必填),比较函数(非必填));

使用形式一:默认从小到大(升序)排序

                      sort(首元素地址,尾元素地址的下一个地址)           

用法案例:登录—专业IT笔试面试备考平台_牛客网

题目

图书馆中每本书都有一个图书编码,可以用于快速检索图书,这个图书编码是一个正整数。

每位借书的读者手中有一个需求码,这个需求码也是一个正整数。如果一本书的图书编码恰好以读者的需求码结尾,那么这本书就是这位读者所需要的。

小 D 刚刚当上图书馆的管理员,她知道图书馆里所有书的图书编码,她请你帮她写一个程序,对于每一位读者,求出他所需要的书中图书编码最小的那本书,如果没有他需要的书,请输出-1。

1.按照输入要求进行输入,利用for循环依次输入图书编号,之后再对图书编号进行排序(从小到大),这样一会查找有无用户要的图书时能直接输出最先查找到的图书编号(题中说的是输出需要的书中编号最小的)。

2.利用for循环输入用户的idx以及长度,并进行查找需要的书中最小图书编号 实现查找函数。

#include <bits/stdc++.h>
#define int long long 
#define endl '\n'

using namespace std;
const int M=2e5+10,N=1e3+10;
int n,q,idx,length;
int book_id[M];

void check(int length,int idx)
{
	int t=pow(10,length);
	for(int i=0;i<n;i++)
	{
		//book_id[i]%t  得到 每一个图书编号的后length位  分别与用户编号比较 
		if(book_id[i]%t==idx)
		{
			cout<<book_id[i]<<endl;
			return ;
		}
	}
	cout<<-1<<endl;
	return ;
}
signed main()
{
	cin>>n>>q;
	for(int i=0;i<n;i++)
	{
		cin>>book_id[i]; 
	}
	
	sort(book_id,book_id+n);
    //从小到大对图书id依次排序
	
	for(int j=0;j<q;j++)
	{
		cin>>length>>idx;
		check(length,idx);
	}
	return 0;
}

 使用形式二:从大到小排序(降序)

                          sort(首元素地址,尾元素地址的下一个地址,比较函数)

比较函数自定义的参数类型要与要排序的元素的类型保持一致

 用法案例:【深基7.例9】最厉害的学生 - 洛谷

题目

现有 N 名同学参加了期末考试,并且获得了每名同学的信息:姓名(不超过 88 个字符的仅有英文小写字母的字符串)、语文、数学、英语成绩(均为不超过 150150 的自然数)。

总分最高的学生就是最厉害的,请输出最厉害的学生各项信息(姓名、各科成绩)。如果有多个总分相同的学生,输出靠前的那位。

1.先定义一个结构体类型Stu,之后再定义一个结构体Stu类型的变量s[M]数组,输入多个学生信息。

2.对所有学生信息按照总分从高到低进行排序,如果总分相等,则输入序号小的排在前边,使用到了自定义得cmp()函数进行排序

3.排序过后,第一个位置的元素即为最厉害的学生信息,对其进行输出

#include <bits/stdc++.h>
#define int long long 
#define endl '\n'

using namespace std;
const int M=2e5+10;
int N;

//创建一个结构体类型Stu
struct Stu
{
	string name;
	int chinese,math,english;
	int sum;
	int id;
};
//创建一个含有Stu类型元素的数组变量是s[M]
Stu s[M];

bool cmp(Stu a,Stu b)
{
	if(a.sum!=b.sum)
	{
		return a.sum>b.sum;
		//结果为true 则不用交换两个元素的位置
		//结果为false 则交换两个元素的位置 保证总分大的在前 
	}
	else
	{
		//结果为true 则不用交换两个元素的位置
		//结果为false 则交换两个元素的位置 保证输入序号小的在前
		return a.id<b.id;
	}
}

signed main()
{
	cin>>N;
	for(int i=0;i<N;i++)
	{
		string name;
		int x,y,z;
		cin>>name>>x>>y>>z;
		s[i]={name,x,y,z,x+y+z,i};
	}
	
	//从大到小排序,用到 比较函数 
	sort(s,s+N,cmp);
	
	//排序过后 此时第一个元素就是最厉害的学生 
	cout<<s[0].name<<' '<<s[0].chinese<<' '
	    <<s[0].math<<' '<<s[0].english<<endl;
	
	return 0;
}

对于此题,还有另一种思路,可以不用排序算法,但程序运行时间没上边的快,不过也是一种思路

1.先定义一个结构体类型Stu,之后再定义一个结构体Stu类型的变量s[M]数组,输入多个学生信息。

2.定义一个下标变量best,先假定第一个位置上的学生是最厉害的学生,之后分别与此位置后的每个元素总分进行比较,若存在下标为i的元素总分s[i].sum()>s[best].sum()。

这里也要说一下 结构体变量内也可以定义函数,这里我就定义了一个求总分的函数sum()在结构体内部。

3.下标为best的元素即为最厉害的学生信息,对其进行输出。

#include<bits/stdc++.h>
#define int long long
#define endl '\n'

using namespace std;
const int M=2e5+10;

int N;
struct Stu
{
	string name;
	int chinese,math,english;
	int sum()
	{
		return chinese + math + english;
	}
};

Stu s[M];

signed main()
{
	cin>>N;
	for(int i=0;i<N;i++)
	{
		string name;
		int x,y,z;
		cin>>name>>x>>y>>z;
		s[i]={name,x,y,z};
	}

	int best=0;
	for(int i=1;i<N;i++)
	{
		if(s[i].sum()>s[best].sum())
		{
			best=i;
		}
	}
	cout<<s[best].name<<' '<<s[best].chinese<<' '
	    <<s[best].math<<' '<<s[best].english<<endl;
	
	return 0;
} 
绝对值排序的概念通常涉及到将一组数字按照它们的绝对值大小进行升序或降序排列。在C++中,实现这一功能的关键步骤包括读取输入、计算每个数的绝对值、进行排序并输出结果。 ### C++ 程序示例 下面是一个简单的C++程序,演示如何对一组整数数组按照其绝对值进行排序: ```cpp #include <iostream> #include <vector> #include <algorithm> // For sort function and abs() #include <cmath> // For fabs() which is used for float numbers int main() { int n; std::cout << "请输入元素数量: "; std::cin >> n; std::vector<double> nums(n); std::cout << "请输入" << n << "个数值: "; // 输入数值 for (int i = 0; i < n; ++i) { std::cin >> nums[i]; } // 使用abs函数转换成绝对值,并使用sort函数排序 std::sort(nums.begin(), nums.end(), [](double a, double b){ return std::fabs(a) < std::fabs(b); // 按照绝对值排序 }); std::cout << "按绝对值排序后的数组为: \n"; for (const auto &num : nums) { std::cout << num << " "; } std::cout << "\n"; return 0; } ``` ### 运行说明: 1. **输入元素数量**: 首先提示用户输入元素的数量`n`。 2. **输入数据**: 用户随后可以输入这`n`个数。 3. **绝对值排序**: - 数组内的每个数使用`std::fabs()`(对于双精度浮点数)或`std::abs()`(对于整型数)计算其绝对值。 - 利用`std::sort`标准库函数,通过提供自定义比较器,按照绝对值的大小进行排序。 4. **输出排序后的数组**: - 打印出排序后的数组。 ### 相关问题: 1. 如何确定程序是否正确实现了绝对值排序的功能? 2. 如果需要处理负数和零的情况,程序应该如何优化? 3. 当数组非常大时,如何考虑性能优化问题? --- 请尝试运行上述代码以理解其工作原理,并根据实际需求调整输入和输出部分以适应各种情况。如果在理解和实现过程中遇到困难,可以进一步提问。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值