原文链接点这

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函数的第三个参数是用来决定两个元素是否要进行交换位置的。

C++中sort函数详解相关推荐

  1. C++ Sort函数详解

    C++ Sort函数详解 前言 :sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变,如果某些场景需要保持相同元素间的相对顺序,可使用 ...

  2. Matlab中 pdist 函数详解

    学习笔记,仅供参考,有错必纠 转载自:Matlab中 pdist 函数详解(各种距离的生成); pdist Pairwise distance between pairs of objects. Sy ...

  3. c++ memset 语言_C/C++ 中memset() 函数详解及其作用介绍

    memset 函数是内存赋值函数,用来给某一块内存空间进行赋值的: 包含在头文件中,可以用它对一片内存空间逐字节进行初始化: 原型为 : void *memset(void *s, int v, si ...

  4. matlab中xcorr函数详解

    Matlab中xcorr函数详解 引言 在matlab中查找相关函数时,找到了xcov函数和xcorr函数,仔细看了帮助文档,发现虽然计算公式不一样,但是两个函数用法相同,计算出的值也相同,于是在翻了 ...

  5. Linux中fork()函数详解

    Linux中fork()函数详解 一.fork入门知识 一个进程,包括代码.数据和分配给进程的资源.fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事, ...

  6. linux 中 sigaction 函数详解

    linux 中 sigaction 函数详解 一.函数原型 sigaction 函数的功能是检查或修改与指定信号相关联的处理动作(可同时两种操作) int sigaction(int signum, ...

  7. java 中indexOf函数详解

    最近在解决android 中listview的查找问题,用到了indexOf 方法,仔细看了下源码,详解如下. private static int indexOf(String source, St ...

  8. STL sort()函数详解

    西方有句谚语:不要重复发明轮子! STL几乎封装了所有的数据结构中的算法,从链表到队列,从向量到堆栈,对hash到二叉树,从搜索到排序,从增加到删除......可以说,如果你理解了STL,你会发现你已 ...

  9. PHP中preg_match函数详解

    目录 函数形式 函数功能 参数详解 pattern sbuject matches 返回值 例子 函数形式 preg_match(string $pattern, string $subject, a ...

最新文章

  1. 搜狗上线海外权威健康搜索 支持中英双语一键切换
  2. 视觉检索:视频多帧排序
  3. 【codeforces 103E】 Buying Sets
  4. 职位越高的人,越容易犯5个错
  5. 天禾云盘【Fly.Box】2.4.0发布,含Android、IOS客户端
  6. 天天Android: (EditText明文、密文切换)
  7. 清华山维eps软件_cass3D三维立体数据采集软件
  8. 小程序和android毕设,微信小程序毕设论文(完整)
  9. wps office 2019中文版
  10. 【AI案例实践】基于深度学习的超分辨率技术
  11. 计算机课电脑如何提网速,一个简单的优化网速方法,以提高Windows7系统电脑网速教程...
  12. Java web 购物网站开发
  13. android模拟触控power键
  14. uniapp开发微信小程序,开发者工具、真机预览都没问题,唯独预览、体验版在手机上列表顺序错乱,用的localeCompare做的中文排序,终于找到问题并解决掉了,记录一下子
  15. Android shape画一个圆角虚线框
  16. Tableau笔记(一):tableau 如何绘制环形图
  17. mysql安装以及安装navicat并且连接
  18. 微软任命 CEO 萨提亚·纳德拉为董事会主席
  19. ionic字符串截取数字
  20. jquery给id加css,JQuery为元素添加样式

热门文章

  1. 虚拟化技术xen的简介和安装
  2. 男生的不主动,会让女生很失望
  3. 8岁女儿写代码哄程序员爸爸开心,网友直呼:破防了
  4. python工程项目管理
  5. 在Hibernate中Query的uniqueResult查询。
  6. java中finalize()方法
  7. Elasticsearch07:ES中文分词插件(es-ik)安装部署
  8. 量化交易:止盈策略与回测
  9. 多x多y的origin图_一张图了解iPhone 12 mini到底有多小
  10. SAP 2009 商业领袖高峰论坛