sort()函数详解

简介: sort()函数详解

一.sort函数是什么?

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


二.sort函数简介

语法

Sort(start,end,cmp)

参数

(1)start表示要排序数组的起始地址;

(2)end表示数组结束地址的下一位;

(3)cmp用于规定排序的方法,可不填,默认升序。

简单来说,第一个参数(start)就是需排序数组名+排序起始数在数组中的下标;第二个参数(end)即需排序数组名+排序起始数+排序数个数;第三个参数较为复杂,我等下再说……

功能

sort函数用于C++中,对给定区间所有元素进行排序,默认为升序,也可进行降序排序。

一般是直接对数组进行排序,例如对数组a[10]排序,sort(a,a+10)。而sort函数的强大之处在可与cmp函数结合使用,即排序方法的选择。

相对于普通的排序算法,sort()函数在快速排序(详见C++快速排序)的基础上,又进行了优化,时间复杂度为n*log2(n),执行效率较高。


三.sort()函数的CMP

1.无需修改,直接套用

sort函数没有第三个参数,实现的是从小到大(升序)排列:

#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
  int a[10];
  for(int i=0;i<10;i++) scanf("%d",&a[i]);
  sort(a,a+10);
  for(int i=0;i<10;i++) printf("%d",a[i]);
  return 0;
}

image.gif

2.较为简单的排序条件修改

#include<iostream>
#include<algorithm>
using namespace std;
bool cmp(int x,int y){
  return x % 10 > y % 10;
}
int main(){
  int num[10] = {65,59,96,13,21,80,72,33,44,99};
  sort(num,num+10,cmp);
  for(int i=0;i<10;i++){
    cout<<num[i]<<" ";
  }//输出结果:59 99 96 65 44 13 33 72 21 80
  return 0;
}

image.gif

3.较为复杂的排序条件自定义

比如每一个学生有四科成绩,我们需要根据学生的四科成绩的平均分高低进行排名,那么这个cmp函数我们就可以定义为:

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
struct Student{
    string name;
    double score[4];
};
bool cmp_score(Student x,Student y){
    double average_x,average_y;
    average_x = (x.score[0]+x.score[1]+x.score[2]+x.score[3])/4;
    average_y = (y.score[0]+y.score[1]+y.score[2]+y.score[3])/4;
    return average_x > average_y;
}
int main(){
    Student stu[3];
    string n;
    int s;
    for(int i=0;i<3;i++){
        cin>>stu[i].name;
        for(int j=0;j<4;j++){
            cin>>stu[i].score[j];
        }
    }
    sort(stu,stu+3,cmp_score);
    for(int i=0;i<3;i++){
        cout<<stu[i].name<<" ";
        for(int j=0;j<4;j++){
            cout<<stu[i].score[j]<<" ";
        }
        cout<<endl;
    }
    return 0;
}

image.gif

总的来说,当CMP返回值为true(符合条件)时,无需交换;反之,返回值为false(不符合条件)时,需要交换。


四.总结

sort()函数是个很有用的妙招,希望大家善用!

相关文章
|
存储 缓存 前端开发
云计算和前端开发的结合:使用云服务提升应用性能
云计算和前端开发的结合:使用云服务提升应用性能
|
1月前
|
机器学习/深度学习 监控 PyTorch
68_分布式训练技术:DDP与Horovod
随着大型语言模型(LLM)规模的不断扩大,从早期的BERT(数亿参数)到如今的GPT-4(万亿级参数),单卡训练已经成为不可能完成的任务。分布式训练技术应运而生,成为大模型开发的核心基础设施。2025年,分布式训练技术已经发展到相当成熟的阶段,各种优化策略和框架不断涌现,为大模型训练提供了强大的支持。
|
存储 安全 Java
Java——String类详解
String 是 Java 中的一个类,用于表示字符串,属于引用数据类型。字符串可以通过多种方式定义,如直接赋值、创建对象、传入 char 或 byte 类型数组。直接赋值会将字符串存储在串池中,复用相同的字符串以节省内存。String 类提供了丰富的方法,如比较(equals() 和 compareTo())、查找(charAt() 和 indexOf())、转换(valueOf() 和 format())、拆分(split())和截取(substring())。此外,还介绍了 StringBuilder 和 StringJoiner 类,前者用于高效拼接字符串,后者用于按指定格式拼接字符串
1228 1
Java——String类详解
|
11月前
|
前端开发 JavaScript 开发者
React 分割线组件 Divider
在现代前端开发中,React 是最流行的 JavaScript 库之一,用于构建可维护的用户界面。本文介绍如何在 React 中使用分割线组件,从基础到高级逐步讲解。基础概念涵盖分割线的作用及其在 React 中的实现方式,包括使用 HTML 标签、第三方库(如 Material-UI 和 Ant Design)及自定义组件。常见问题及解决方案部分讨论了样式不一致、间距不当和响应式设计等问题,并提供了解决方案。高级用法则介绍了自定义分割线组件和动态生成分割线的方法。希望本文能帮助你在实际项目中更好地使用分割线组件。
413 71
|
9月前
|
机器学习/深度学习 编解码 计算机视觉
RT-DETR改进策略【卷积层】| ECCV-2024 小波卷积WTConv 增大感受野,降低参数量计算量,独家创新助力涨点
RT-DETR改进策略【卷积层】| ECCV-2024 小波卷积WTConv 增大感受野,降低参数量计算量,独家创新助力涨点
382 9
RT-DETR改进策略【卷积层】| ECCV-2024 小波卷积WTConv 增大感受野,降低参数量计算量,独家创新助力涨点
|
机器学习/深度学习 人工智能 数据可视化
拥抱低代码平台:加速开发流程与降低技术门槛
【10月更文挑战第25天】低代码平台作为一种新兴的开发工具,通过可视化开发环境和预构建模块,加速了软件开发流程,降低了技术门槛,使非专业开发者也能参与其中。本文探讨了低代码平台的优势、挑战及其实用工具,展望了其未来的发展趋势,并分享了业界评论和职业心得。
|
机器学习/深度学习 算法
【机器学习】P问题、NP问题、NP-hard、NP-C问题解析与举例理解
本文解析了P问题、NP问题、NP-hard问题以及NP-Complete问题的概念,并通过实例帮助理解NP问题的特点和复杂性。
4146 1
|
JavaScript 数据库
❤Nodejs 第七章(操作本地数据库高并发createPool方式)
【4月更文挑战第7天】本文介绍了如何使用Node.js操作本地数据库接口的优化,将之前的单次连接(createConnection)替换为支持高并发的连接池(createPool)。主要改动包括:查询、新增用户、获取用户详情、更新和删除用户的方法,都改用`connectionpool.query()`。这样改进能提升效率,适应更多并发请求。代码示例展示了如何在路由处理函数中使用连接池进行数据库操作。
322 6
❤Nodejs 第七章(操作本地数据库高并发createPool方式)
|
并行计算 PyTorch 算法框架/工具
PyTorch 2.2 中文官方教程(十七)(4)
PyTorch 2.2 中文官方教程(十七)
554 2
PyTorch 2.2 中文官方教程(十七)(4)
|
数据采集 前端开发 JavaScript
Python爬虫技术:动态JavaScript加载音频的解析
Python爬虫技术:动态JavaScript加载音频的解析