STL(第一弹)——sort

STL(第一弹)——sort函数

今天我们来讲一讲STL之中的sort(快排)函数

其时间复杂度为 O ( n l o g n ) O(nlogn) O(nlogn)

为何会有log的存在呢,是因为它用了二分的方法和随机数(重中之重,没有随机数会退化成 O ( n 2 ) O(n^2) O(n2)

sort函数分为两种:

  1. sort(_RAIter, _RAIter)
  2. sort(_RAIter, _RAIter, _Compare)

翻译后即为sort(数组名+开始排序的数的下标(包含),数组名+(停止排序的数的下标+1))

通常地,sort总是为整数数组进行升序排序
代码如下:

#include<cstdio>
#include<algorithm>
using namespace std;
int x[1010],n;
int main()
{
    
    
	scanf("%d",&n);//输入需要排序的数的个数
	for(int i=1;i<=n;i++)
		scanf("%d",&x[i]);//输入
	sort(x+1,x+1+n);//升序排序
	for(int i=1;i<=n;i++)
		printf("%d ",x[i]);//输出
} 

程序运行结果如下在这里插入图片描述
那如何才能进行降序排列呢,就要用到一个比较函数了。(个人喜欢把比较函数定义为cmp(compare的缩写))

代码如下:

#include<cstdio>
#include<algorithm>
using namespace std;
int x[1000],n;
bool cmp(int a,int b)
{
    
    
	return a>b;//若此处为return a<b的话则是升序排序
}
int main()
{
    
    
	scanf("%d",&n);//输入需要排序的数的个数
	for(int i=1;i<=n;i++)
		scanf("%d",&x[i]);//输入
	sort(x+1,x+1+n,cmp);//降序排序
	for(int i=1;i<=n;i++)
		printf("%d ",x[i]);//输出
} 

sort判断换不换两个数组中的数时有一点特殊:

若cmp函数返回true则不换,返回false则换(这里可能有点不好想)

个人分辨方法便是任意一个 a = x i , b = x j ( i < j ) a=x_i,b=x_j(i<j) a=xi,b=xj(i<j)都会在排完序后的x数组中符合上面的关系式a>b
运行结果如下:
在这里插入图片描述
还有一些结构体也可以排序,大家学过结构体的可细想一下+具体操作一下,其名称为关键字排序 ( 我 们 老 师 这 样 叫 的 , 不 专 业 的 话 勿 喷 ) _{(我们老师这样叫的,不专业的话勿喷)}

此处有一道经典题,大家可以结合看一下

题目:
为了让老师能更好地排出期中考试的分数,请你帮帮老师用一个程序快速排出第一到最后一名的名字

  1. 总成绩高的排在前面
  2. 若总成绩相同,语文成绩高的排在前面
  3. 若语文成绩相同,数学成绩高的排在前面
  4. 若数学成绩相同,英语成绩高的排在前面
  5. 若英语成绩相同,学号靠前的排在前面(老师输入学生成绩时,总会按学号从低到高输入)

代码如下:

#include<cstdio>
#include<algorithm>
using namespace std;
int n;
struct cj{
    
    
	int yuwen,shuxue,yingyu,total;
	int xuehao;
	char name[100];
}x[1010];
bool cmp(cj a,cj b)
{
    
    
	if(a.total!=b.total)return a.total>b.total;//第一关键字
	if(a.yuwen!=b.yuwen)return a.yuwen>b.yuwen;//第二关键字
	if(a.shuxue!=b.shuxue)return a.shuxue>b.shuxue;//第三关键字
	if(a.yingyu!=b.yingyu)return a.yingyu>b.yingyu;//第四关键字
	return a.xuehao<b.xuehao;//第五关键字
}
int main()
{
    
    
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
    
    
		scanf("%s%d%d%d",x[i].name,&x[i].yuwen,&x[i].shuxue,&x[i].yingyu);
		x[i].xuehao=i;
		x[i].total=x[i].yuwen+x[i].shuxue+x[i].yingyu;
	}
	sort(x+1,x+1+n,cmp);
	for(int i=1;i<=n;i++)
	{
    
    
		printf("%s\n",x[i].name);
	}
} 

运行结果如下:
在这里插入图片描述
此处便是所有的sort的基本用法,咱们下期见!!!

猜你喜欢

转载自blog.csdn.net/Ricky2007/article/details/109428243
今日推荐