首先最基本的是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,即每个元素在原数组中的相对位置。
整体来说,这段代码实现了一种对数组元素排序的方法,并记录了排序后的相对位置。这在某些排序问题中可能是有用的。