比较函数的一些讲解

首先最基本的是sort函数,如果想使用它请不要忘记添加头文件#include<algorithm>,同时sort函数的使用格式为:

sort(想要进行排序的部分对应的首地址,想要进行排序的部分的末地址+1);
举个例子,假设这时候有一个数组a,a[1]到a[n]存储了元素,如果我们想将下标为1到n的数组元素进行排序,就需要这样写:
sort(a+1,a+n+1); 

这样就实现了将a数组的a[1]一直到a[n]进行了排序,需要强调的一点就是sort函数是默认将排序的部分按从小到大的顺序进行排序的。

另外在具体赘述比较函之前,我们先看一个简单的问题,如果我已知一个序列,我需要将他按从大到小的顺序进行排序应该怎么做?

接下来看两种方法实现:

方法一:

#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=1e5;
int n,a[maxn];
int main(){
	cin>>n;
	for(int i=1;i<=n;i++)
	cin>>a[i];
	sort(a+1,a+n+1);
	int b[maxn];
	for(int i=1;i<=n;i++)
	b[i]=a[i];
	int x=1;
	for(int i=n;i>=1;i--){
		a[i]=b[x++];
	}
	return 0;
}

方法二:

#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=1e5;
int n,a[maxn];
int main(){
	cin>>n;
	for(int i=1;i<=n;i++)
	cin>>a[i];
	for(int i=1;i<=n;i++)
     a[i]=-1*a[i];
	sort(a+1,a+n+1);
	for(int i=1;i<=n;i++)
	a[i]=-1*a[i];
	for(int i=1;i<=n;i++)
	cout<<a[i]<<' ';
	return 0;
}

接下来介绍如何使用sort把数字从大到小排序,先来看一段代码:

 其中在cmp函数中加上&符号是为了让程序跑的更快,但是需要注意的是,如果加了&符号,当使用函数的时候,函数里面的值改变了的话对应的函数外面的值也会改变,加上const的目的就是让传进去的x,y的值在使用函数的时候值不改变。

接下来看一道经典的使用比较函数的题目:

可以看出这道题目是比较函数知识点的裸题,所以也不需要进行太多讲解,以下是代码实现:

#include<iostream>
#include<algorithm>
using namespace std;
bool cmp(const int &x,const int &y){
	return x>y;
}
int n,a[1001];
int main(){
	cin>>n;
	for(int i=1;i<=n;i++)
	cin>>a[i];
	sort(a+1,a+n+1,cmp);
	for(int i=1;i<=n;i++)
	cout<<a[i]<<' ';
	return 0;
}

 再看一道排序题:

代码实现如下:

#include<iostream>
#include<algorithm>
using namespace std;
int n,a[100001],c[100001],r[100001];//a数组用来记录每个数字,c数组用来记录一开始的序号, 
bool cmp(const int &x,const int &y){ //r数组用来记录排完序后对应的序号。
     if(a[x]!=a[y]) return a[x]<a[y];//将a数组中的元素按从小到大的顺序进行排列
     else return x<y;//如果两个元素值相等,则按照一开始在a数组下标小的排前面进行排序
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++)
	cin>>a[i];
	for(int i=1;i<=n;i++)
	c[i]=i;
    /*这里和cmp函数结合,通过cmp函数将a,c数组合并在一起进行排序并达到相同的目的
       请仔细理解*/
	sort(c+1,c+n+1,cmp);
	for(int i=1;i<=n;i++)
    /*输出排序之后从小到大的数组元素*/
    cout<<a[c[i]]<<' ';
	cout<<endl;
    /*接下来这两行需要结合上面代码共同理解,如果上面的代码没有理解透彻下面这一个是很难看懂的*/
	for(int i=1;i<=n;i++)
	r[c[i]]=i;
    /*逐个输出一开始数组中元素在排完序后对应的下标*/
	for(int i=1;i<=n;i++)
	cout<<r[i]<<' ';
	return 0;
}

接下来我将对此代码进行阐述:

int n, a[100001], c[100001], r[100001];
  • n:表示数组 a 的大小。
  • a:存储待排序的元素的数组。
  • c:辅助数组,存储排序前的数组下标。
  • r:记录排序后元素在原数组中的相对位置。
bool cmp(const int &x, const int &y){
    if (a[x] != a[y]) 
        return a[x] < a[y];
    else 
        return x < y;
}

这个比较函数用于在排序时确定元素的相对顺序。如果 a[x] 不等于 a[y],则按照 a 数组的值升序排序;如果相等,再按照数组下标升序排序。

初始化数组 c,并排序:
for(int i = 1; i <= n; i++)
    c[i] = i;
sort(c + 1, c + n + 1, cmp);
初始化数组 c 为 [1, 2, ..., n],然后使用 sort 函数对数组 c 进行排序,排序的依据是比较函数 cmp。
输出排序后的数组 a:
for(int i = 1; i <= n; i++)
    cout << a[c[i]] << ' ';
cout << endl;
输出排序后的数组 a,按照排序后的下标顺序输出元素。

记录排序后元素在原数组中的相对位置:
for(int i = 1; i <= n; i++)
    r[c[i]] = i;
遍历排序后的数组 c,记录每个元素在排序后数组中的位置。
输出相对位置数组 r:
for(int i = 1; i <= n; i++)
    cout << r[i] << ' ';
输出相对位置数组 r,即每个元素在原数组中的相对位置。

整体来说,这段代码实现了一种对数组元素排序的方法,并记录了排序后的相对位置。这在某些排序问题中可能是有用的。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

残念亦需沉淀

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

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

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

打赏作者

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

抵扣说明:

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

余额充值