集训二:排序及CMP函数
前言
因众多学长学姐已经详细出过集训的答案,故在此不做补充,谨提供课堂笔记以作参考。(大一新生一枚,所写内容不够严谨,望多多包涵互相进步)
提示:以下是本篇文章正文内容,下面案例可供参考
一、sort排序(c++自带函数)
1.我们做一个初步了解:
a.在c语言中我们的排序通常为冒泡选择方法。
b.sort排序的复杂度为n*log(n)。
c.包含在头文件
#include<algorithm>
的c++标准库里。
2. 函数有三个参数
a.要排序的数组的起始地址。
b.数组的结束地址。
c.第三个参数是排序的方法,可以不写,默认是从小到大。
格式:sort(a,a+n) -----默认从小到大排序
比如 int a[ ]={2,7,1,5,0} 五个数
我们可以写成 sort(a,a+5);
即:a为数组名,a+n的n为数组a中的前n个元素。
int a[10]
sort(a,a+n);
//其中的排序是从a[0]开始的直到a[n],而非从a[1]开始,故我们写作 sort(a+1,a+1+n);便可以从a[1]开始,这也是老师的一贯写法。
d.从小到大排序可以写成
sort(a,a+n,less<要进行排序的数据类型>())
从大到小排序可以写成
sort(a,a+n,greater<要进行排序的数据类型>())
其中要进行排序的数据类型可以是我们自己定义的如cmp函数
e.举例
#include <bits/stdc++.h>
using namespace std;
struct sa
{
int a;
int b;
}data[100];//集训一中我们所学的结构体
int main()
{
for(int i=1;i<=5;i++)
cin>>data[i].a>>data[i].b;
sort(data+1,data+1+5);// 此处为默认排序从小到大
for(int i=1;i<=5;i++)
cout<<data[i].a<<" "<<data[i].b<<endl;
return 0;
}
二、cmp函数
1.格式
比如我们要按成绩排序从高到低
int cmp1(stu a,stu b)
{
return a.chengji>b.chengji;
}
其中
cmp为函数名称
stu 为数组,可能为结构体数组
stu a,stu b 中的a,b 指两个任意数组
返回值中的 chengji 指的是结构体中的变量
return 中的 “>” 表示从大到小排列
举例
int cmp2(int a,int b)
{
return a<b;
}
其中我们常见一种写法用到了bool型函数指的是返回值为bool类型的函数,其调用方式和int 型函数没有太大的区别。
bool型变量的值只有 真 (true) 和假 (false),bool可用于定义函数类型为布尔型。
举例
bool cmp1(stu a,stu b)
{
return a.chengji>b.chengji;
}
2.多层次比较的情况
对于一个结构体,如果们要求a数组按x值的从小到大排序,若x相等,按y的从小到大排,我们写成:
struct node
{
int x,y;
}a[10];
bool cmp3(node a,node b)
{
if(a.x==b.x)
return a.y<b.y;
else return a.x<b.x;
}
当然也可以涉及很多个方面的逐一排序,方法同上
三、桶排序(一种小技巧)
1.桶排序的介绍
桶排序是一种计数排序,就是把要排序的数据放到桶里,我们需要设置桶的数量(即排序的范围),把数据放到与之匹配的桶里,改变记录桶有多少个数据的变量(一定要在装数据之前初始化),输出时要遍历所有桶,选数据不为0的数据输出,按编号输出即可。
2.桶排序的举例
举个例子:小明班上五个同学,他们期末考试的成绩分别是5分,3分,5分,2分,8分(满分10分)
我们要把他们的成绩排序
首先,我们可以想到可以用sort排序
另一种方法:分数的取值是0~10分,我们可以定义一个一维数组a[11],刚开始我们把这个数组里的所有元素初始化为0,表示这些分数还没有人得过,比如a[0]=0,即还没有人获得0分…a[10]=0,即还没与人获得10分
下面开始处理这五个人的分数
5分,3分,5分,2分,8分
第一个人5分,我们把a[5]的值改为1,意思是5分出现过一次
第二个人是3分,我们把a[3]的值改成1,意思是3分出现过1次
以此类推后整体的过程如下图:
实现过程代码如下:
#include<stdio.h> int main() { int a[11],i,j; for(i=0;i<11;i++) { a[i]=0; } int n;//人数 scanf("%d",&n); int t;//用t接收分数 for(i=0;i<n;i++) { scanf("%d",&t); a[t]++; } for(i=0;i<11;i++) { for(j=1;j<=a[i];j++) { printf("%d ",i); } } printf("\n"); return 0; } 若是从大到小输出则把 for(i=0;i<11;i++)改成 for(i=10;i>=0;i--)即可 //参考原作者ljw学长
3.补充
a.在装数据之前要初始化。
b.输出时要遍历所有的桶。
c.选数据不为0的数据输出,按编号输出即可。
四、总结
sort与cmp通常需要我们结合起来运用,再配合结构体数组效果更佳;而桶排序在特定场景中会有不一样的效果。
参考:林大ACM集训队寒假第二讲。