集训二:排序及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集训队寒假第二讲。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值