STL(第一弹)——sort函数
今天我们来讲一讲STL之中的sort(快排)函数
其时间复杂度为 O ( n l o g n ) O(nlogn) O(nlogn)
为何会有log的存在呢,是因为它用了二分的方法和随机数(重中之重,没有随机数会退化成 O ( n 2 ) O(n^2) O(n2))
sort函数分为两种:
- sort(_RAIter, _RAIter)
- 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
运行结果如下:
还有一些结构体也可以排序,大家学过结构体的可细想一下+具体操作一下,其名称为关键字排序 ( 我 们 老 师 这 样 叫 的 , 不 专 业 的 话 勿 喷 ) _{(我们老师这样叫的,不专业的话勿喷)} (我们老师这样叫的,不专业的话勿喷)
此处有一道经典题,大家可以结合看一下
题目:
为了让老师能更好地排出期中考试的分数,请你帮帮老师用一个程序快速排出第一到最后一名的名字
- 总成绩高的排在前面
- 若总成绩相同,语文成绩高的排在前面
- 若语文成绩相同,数学成绩高的排在前面
- 若数学成绩相同,英语成绩高的排在前面
- 若英语成绩相同,学号靠前的排在前面(老师输入学生成绩时,总会按学号从低到高输入)
代码如下:
#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的基本用法,咱们下期见!!!
下一期:STL(第二弹)——二分查找(binary_search、upper_bound、lower_bound)