C++中sort函数详解

2023-10-29

原文链接点这

0.简介

sort函数用于C++中,对给定区间所有元素进行排序,默认为升序,也可进行降序排序。sort函数进行排序的时间复杂度为n*log2n,比冒泡之类的排序算法效率要高,sort函数包含在头文件为#include的c++标准库中

1.sort的参数

sort(start,end,cmp)
start:表示排序数组起始的位置

end:表示排序数组结束的位置

cmp:用于排序的方法,可以不填,不填默认升序

2.数组中的用法

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int a[5]={1,9,3,4,5};
    for(int i=0;i<5;i++)
        cout<<a[i]<<" ";
    sort(a,a+5);  //数组从0开始,数组有多少个数就加多少 
    cout<<endl;
    for(int i=0;i<5;i++)
        cout<<a[i]<<" ";
    return 0;
}

当我们加上cmp函数后,下面这种写法和上面的结果一样

#include<bits/stdc++.h>
using namespace std;
bool cmp(int x, int y)
{
    return x<y;    
    /*
        可以这样理解,sort第三个参数默认升序,
        这个地方是个bool函数。
        如果返回值结果为假,那么函数会互换他们的位置
        如果返回结果为真,就保持原来的位置不变 。
        如果x<y成立,那么就保持不变,否则就交换位置。 
    */ 
} 
int main()
{
    int a[5]={1,9,3,4,5};
    for(int i=0;i<5;i++)
        cout<<a[i]<<" ";
    sort(a,a+5,cmp);  //数组从0开始,数组有多少个数就加多少 
    cout<<endl;
    for(int i=0;i<5;i++)
        cout<<a[i]<<" ";
    return 0;
}

可以这样理解,sort中的第三个参数,会去进行两两元素的比较,
函数这个地方是个bool类型的函数。
如果返回值结果为假,那么函数会互换他们的位置
如果返回结果为真,就保持原来的位置不变函数

那么,如果把cmp中的函数改成 return x>y; 那么默认就是 从大到小排序。

3.结构体中的用法

平常做题的时候可能会遇到下面几种情况:

一个结构体需要排序,里面属性太多,只根据一个属性进行排序,其余属性需要同步更改位置,单纯使用冒泡需要交换的东西太多
一个结构体需求排序,但是排序依据不唯一。例如下面结构体

struct student{
    char name[50];   //学生姓名 
    int sum;   //总成绩  
    int chinese;  //语文成绩 
    int math;  //数学成绩 
    int english;  //英语成绩 
};

要求先按照总成绩排序,如果总成绩相同,则按照数学成绩排序,如果数学成绩相同,则按照英语成绩排序,如果英语成绩相同则按照语文成绩排序。

。。。。。。

先来解决第一个问题,假如只按照总成绩排序,总成绩相同的不做任何排序处理。

#include<bits/stdc++.h>
using namespace std;
struct student{
    char name[50];   //学生姓名 
    int sum;   //总成绩  
    int chinese;  //语文成绩 
    int math;  //数学成绩 
    int english;  //英语成绩 
};
student s[50]; 
bool cmp(student x, student y)  //参数类型要写成结构体类型, 
{
    return x.sum>y.sum;    
} 
int main()
{    
    int n;// 定义数据
    cin>>n;
    for(int i=0;i<n;i++) 
    {
        cin>>s[i].name>>s[i].chinese>>s[i].math>>s[i].english;
        s[i].sum=s[i].chinese+s[i].math+s[i].english;    
    }    
    sort(s,s+n,cmp);
    cout<<"按总成绩排序后的结果是:"<<endl; 
    cout<<"name"<<" "<<"语文"<<" "<<"数学"<<" "<<"英语"<<" "<<"总成绩"<<endl; 
    for(int i=0;i<n;i++) 
    {
        cout<<s[i].name<<" "<<s[i].chinese<<" "<<s[i].math<<" "<<s[i].english<<" "<<s[i].sum<<endl;    
    }   
    
    return 0;
}
/*
8
tom1 10 20 30
tom2 10 30 30
tom3 20 30 30
tom4 10 30 10
tom5 30 40 10
tom6 10 15 10
tom7 30 20 15
tom8 20 10 15    
*/


在这里插入图片描述

可以看出是按照总计成绩进行排序的。可以看出,我们在cmp函数中只要写一个结构体中的参数就可以了。

那么第二个问题来了。我们可以继续改cmp中的写法

#include<bits/stdc++.h>
using namespace std;
struct student{
    char name[50];   //学生姓名 
    int sum;   //总成绩  
    int chinese;  //语文成绩 
    int math;  //数学成绩 
    int english;  //英语成绩 
};
student s[50]; 
bool cmp(student x, student y)  //参数类型要写成结构体类型, 
{
    //先按照总成绩由大到小排(如果两个数的总成绩不相等,则根据大小关系判断是否交换位置)
    if(x.sum!=y.sum)     
        return x.sum>y.sum;
    //如果总成绩相同,再按照数学成绩进行排序  
    if(x.math!=y.math)
        return x.math>y.math;
    //如果数学成绩相同,再按照英语成绩进行排序         
    if(x.english!=y.english)
        return x.english>y.english;
    else  //最后只剩语文了 
        return x.chinese>y.chinese; 
} 
int main()
{    
    int n;// 定义数据
    cin>>n;
    for(int i=0;i<n;i++) 
    {
        cin>>s[i].name>>s[i].chinese>>s[i].math>>s[i].english;
        s[i].sum=s[i].chinese+s[i].math+s[i].english;    
    }    
    sort(s,s+n,cmp);
    cout<<"按总成绩排序后的结果是:"<<endl; 
    cout<<"name"<<" "<<"语文"<<" "<<"数学"<<" "<<"英语"<<" "<<"总成绩"<<endl; 
    for(int i=0;i<n;i++) 
    {
        cout<<s[i].name<<" "<<s[i].chinese<<" "<<s[i].math<<" "<<s[i].english<<" "<<s[i].sum<<endl;    
    }   
    
    return 0;
}
/*
8
tom1 10 20 50
tom2 10 30 40
tom3 10 40 30
tom4 20 20 40
tom5 30 20 30
tom6 40 20 20
tom7 30 20 30
tom8 20 20 30    
*/

在这里插入图片描述

可以看出,首先按照总成绩排序,如果总成绩相同,则按照数学成绩排序,如果数学成绩相同,则按照英语成绩排序。题目的样例不够完善,没有体现出如果在上面的条件下,如果英语成绩也相同的情况。

4.总结

不论是单纯的数组还是结构体,sort函数的第三个参数是用来决定两个元素是否要进行交换位置的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++中sort函数详解 的相关文章

随机推荐

  • 静态链表及其操作

    静态链表就是利用数组来实现链表 目的是为了整合顺序表和链表的优势 比如顺序表适合定位元素 链表适合删除和插入元素等等 本例子用Java来实现的 代码方面可能还有些不足 但是运行的结果是准确的 对于理解没有障碍 Demo类 package c
  • 【react+ts】拖拽功能简单小demo实现

    tsx import Component from react import drog sass interface Props interface state X number Y number class Drog extends Co
  • TCP —— 流量控制

    一 流量控制 二 示例 传输层和数据链路层的流量控制的区别 传输层定义端到端用户之间的流量控制 数据链路层定义两个中间的相邻结点的流量控制 另外 数据链路层的滑动窗口协议的窗口大小不能动态变化 传输层的则可以动态变化
  • vsto excel 判断某列都是空值或者是常量

    if worksheet Range A1 A38 SpecialCells Excel XlCellType xlCellTypeConstants null return false public enum XlCellType 摘要
  • Unity3d C#开发WebGL平台转微信小游戏保姆级教程(喜大普奔)

    广告 通过一段时间的基于minigame unity webgl transform插件的开发 算是稍微完整的一小个游戏已经制作完成 具体大家可以扫码体验一下 感谢支持 前言 之前馋与wx小游戏的大流量的广告分成 用cocos creato
  • 找不到xinput1_3.dll怎么办?xinput1_3.dll丢失的四个修复方法

    在我们打开游戏的或者软件的时候 电脑提示 找不到xinput1 3 dll 无法继续执行此代码 怎么办 相信困扰着不少小伙伴 我再在打开吃鸡的时候 然后花了一上午的时候时间研究 现在终于知道xinput1 3 dll文件是什么 也总结了四个
  • [转]多人游戏位置同步—网络游戏的位置同步

    有关位置同步的方案实际上已经比较成熟 网上也有比较多的资料可供参考 在 带宽限制下的视觉实体属性传播 一文中 作者也简单提到了位置同步方案 的构造过程 但涉及到细节的地方没有深入 这里专门针对这一主题做些回顾 最直接的同步方案就是客户端在每
  • Qt Creator中增加新的ui文件时报错

    原因分析 moc 开头的文件编译过程中没有又一次生成导致 解决的方法 删除编译产生的build目录 又一次编译就可以 错误类型截图例如以下 这个问题的解决 使得能够在不论什么时候都能够在project中加入新的ui文件 而不必在開始就加入全
  • linux修改文件名的三种方法

    文章目录 前言 一 用mv命令修改文件名 二 使用cp命令修改 三 使用rename命令修改 总结 前言 我们在使用linux系统过程中为了便于记忆或整理维护 经常需要对文件名进行修改 下面文章介绍了linux系统的三种修改文件名称的方式
  • logback时区设置东八区,生产环境配置

    写在springboot启动类main里面 设置时区东八区 TimeZone timeZone TimeZone getTimeZone GMT 08 TimeZone setDefault timeZone System out prin
  • 【webpack】webpack打包后, 静态图片资源不显示的若干个问题

    背景 最近在搭建公司的前端组件库 vue写的 webpack打包后 在项目中引用组件库 其中有个组件引用了静态图片资源 然而打包后在项目中引用该组件的图片就不显示了 遇到了以下问题 小小记录一下 1 打包时报错 问题 webpack打包时报
  • QT:头部菜单栏和右击菜单事件

    实现思路 1 gt 每一个小的选项都是一个action 项 一个menu 菜单 可以盛放很多action 一个菜单栏 QMenuBar 可以盛放很多menu 2 gt 把以上的嵌套起来就组合成了头部菜单栏 一般只能设置一个 3 gt men
  • Android的第一天

    早就想学下Android开发了 目前为止flash开发Android还不给力 所以还是老老实实的研究用java 开发 apk吧 下载好了 Android开发视频 看了两个视频 现在开始配置环境 ADK https dl ssl google
  • 在kali中进行bp字典爆破——攻防世界weak_auth结尾附带常用bp字典

    第一步 在kali中启动burpsuite 第二步 进入Proxy代理模块 代理模块是Burp的核心模块也是我们平时使用最多的模块 它主要用来拦截并修改浏览器 手机APP等客户端的HTTP HTTPS数据包 第三步 打开代理的浏览器进入题目
  • matlab函数 在线说明,matlab函数说明

    如果你刚接触matlab 可以看这篇Matlab自定义函数详解 MATLAB自定义函数形式function a b c funname x1 x2 x3 输入变量 对于输入变量 MATLAB可以识别输入变量的个数 通过nargin来记录当前
  • VC/MFC如何设置对话框背景颜色

    方法一 调用CWinApp类的成员函数SetDialogBkColor来实现 这个函数已经废弃 1 void SetDialogBkColor COLORREF clrCtlBk RGB 192 192 192 COLORREF clrCt
  • 二、OSPFv2 LSA详解

    OSPFv2 LSA 什么是LSA LSA头格式 LSA的类型 Router LSA Type 1 路由器LSA 类型1 Network LSA Type2 网络LSA 类型2 Network Summary LSA Type3 网络汇总L
  • 考研OR工作----计算机操作系统简答题及疑难知识点总结(第二章 进程的描述与控制)

    计算机操作系统从第二章开始内容会变得异常多 还是希望能够帮助到大家 在这一章阿婆主还会把书上的典型的PV操作题给打上来 给大家用作参考 如果有问题的地方 还请大家在文章下方留言 我好更正 或者你们有更好的PV操作的解法 也欢迎大家在文章下方
  • 从入门到渐入佳境——记我的第六届字节青训营经历

    文章目录 为什么参加 开营前 开营后 做项目 准备答辩 为什么参加 参加第六届字节青训营之前 我也参加了今年5 6月的第五届青训营 最初是在我们学校一个工作室群里看到的 是一个学长发出来的 当时看到了非常感兴趣 想着是学点新知识 因为当时我
  • C++中sort函数详解

    原文链接点这 0 简介 sort函数用于C 中 对给定区间所有元素进行排序 默认为升序 也可进行降序排序 sort函数进行排序的时间复杂度为n log2n 比冒泡之类的排序算法效率要高 sort函数包含在头文件为 include的c 标准库