C++之sort()函数详解,刷题必备~

2023-10-26

        顾名思义,sort就是用来排序的函数,它根据具体情形使用不同的排序方法,效率较高。一般来说,不推荐使用C语言中的qsort函数,原因是qsort用起来比较烦琐,涉及很多指针的操作。而且sort在实现中规避了经典快速排序中可能出现的会导致实际复杂度退化到(o(n^{2})的极端情况。希望读者能通过这篇介绍来轻松愉快地使用sort函数。
1.如何使用sort排序
        sort函数的使用必须加上头文件“#include<algorithm>”和“using namespace std;”,其使用的方式如下:
        sort(首元素地址(必填),尾元素地址的下一个地址(必填),比较函数(非必填));
可以看到,sort的参数有三个,其中前两个是必填的,而比较函数则可以根据需要填写,如果不写比较函数,则默认对前面给出的区间进行递增排序。

#include <stdio.h>
#include <algorithm>
using namespace std;
int main(){
int a[6] = {9,4,2,5,6,-1};
sort(a,a+4);
//a[0]~a[3]从小到大排序
for(int i=0;i<6;i++){
    printf("%d",a[i]);
}
printf("\n");
//a[0]~a[5]从小到大排序
sort(a,a+6);
for(int i=0;i<6;i++){
	printf("%d",a[i]);
 }
	return 0;
}

        运行之后可以得到下面的结果,可以试着理解一下(特别注意理解“尾元素地址的下一个地址”)。输出结果:

24596-1
-124569

 又如,对double型数组排序:

#include <stdio.h>
#include <algorithm>
using namespace std;
int main(){
	double a[] = {1.1,-1.1,99};
	sort(a,a+3);
	for(int i=0;i<3;i++){
		printf("%.1f",a[i]);
	}
	return 0;

}

 输出结果:

-1.1 1.1 99.0

再如,对char数组排序(默认为字典序) 

#include <stdio.h>
#include <algorithm>
using namespace std;
int main(){
	char c[]={'I','L','O','V','E','U'};
	sort(c,c+6);
	for(int i=0;i<6;i++){
		printf("%c",c[i]);
	}
	return 0;
}

 输出结果:

EILOUV

 2.如何实现比较函数cmp

        下面介绍对于基本数据类型、结构体类型、STL容器进行自定义排序cmp的写法。

        2.1基本数据类型数组的排序

若比较函数不填,默认升序排序 ,下面为对int数组的排序:

#include <stdio.h>
#include <algorithm>
using namespace std;
int main(){
	int a[5] = {3,5,2,1,4};
	sort(a,a+5);
	for(int i=0;i<5;i++){
		printf("%d",a[i]);
	}
	return 0;
}

  输出结果:

12345

 如果想要降序排列,则需要使用cmp函数“告诉”sort何时交换元素,可以这样写:

#include <stdio.h>
#include <algorithm>
using namespace std;
bool cmp(int a,int b){
	return a>b;
	//可以理解为a>b时,把a放在前面 
}
int main(){
	int a[5] = {3,5,2,1,4};
	sort(a,a+5,cmp);
	for(int i=0;i<5;i++){
		printf("%d",a[i]);
	}
	return 0;
}

  输出结果:

54321

        这样就可以让数值大的元素在前面,即降序排列,对于double,char亦如此,把cmp内传入参数的类型改变一下就好了。

        2.2结构体数组的排序

        现在定义了如下结构体:

struct node{
    int x,y;
}ssd[10];

如果想让ssd数组按照x从大到小排列,可以这样写cmp函数:

bool cmp(node a, node b){
    return a.x > b.x;
}

示例如下:

#include <stdio.h>
#include <algorithm>
using namespace std;
struct node{
    int x,y;
}ssd[10];
bool cmp(node a, node b){
    return a.x > b.x; //按照x降序排列 
}
int main(){
	ssd[0].x=2; //{2,2} 
	ssd[0].y=2;
	ssd[1].x=1; //{1,3}
	ssd[1].y=3;
	ssd[2].x=3; //{3,1}
	ssd[2].y=1;
	sort(ssd,ssd+3,cmp);
	for(int i=0;i<3;i++){
		printf("%d %d\n",ssd[i].x,ssd[i].y);
	}
	return 0;
}

 输出结果:

3 1
2 2
1 3

 如果想先按照x降序,x相等时,y升序排列(二级排序),那么:

#include <stdio.h>
#include <algorithm>
using namespace std;
struct node{
    int x,y;
}ssd[10];
bool cmp(node a, node b){
    if(a.x!=b.x) return a.x>b.x;
	else return a.y < b.y; //按照x降序排列 
}
int main(){
	ssd[0].x=2; //{2,2} 
	ssd[0].y=2;
	ssd[1].x=1; //{1,3}
	ssd[1].y=3;
	ssd[2].x=2; //{2,1}
	ssd[2].y=1;
	sort(ssd,ssd+3,cmp);
	for(int i=0;i<3;i++){
		printf("%d %d\n",ssd[i].x,ssd[i].y);
	}
	return 0;
}

 输出结果:

2 1
2 2
1 3

         2.3容器的排序

        在STL标准容器中,只有vector、string、deque可以使用sort。这是因为像set,map这种容器是用红黑树实现的,元素本身有序,因此不允许使用sort排序。

下面以vector为例:

#include <stdio.h>
#include <vector>
#include <algorithm>
using namespace std;
bool cmp(int a,int b){
	return a>b;
}

int main(){
	vector<int> vi;
	vi.push_back(3);
	vi.push_back(1);
	vi.push_back(2);
	sort(vi.begin(),vi.end(),cmp); //整个排序
	for(int i=0;i<3;i++){
		printf("%d ",vi[i]);
	} 
	return 0;
}

 输出结果:

3 2 1

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

C++之sort()函数详解,刷题必备~ 的相关文章

  • 为什么双空花括号 { { } } 创建一个只有一个元素而不是零的 std::initializer_list

    我有以下构造函数 MyItem std initializer list
  • 在多个环境中执行编码的 UI 测试

    现在 我的编码 UI 测试使用它们的 app config 来确定它们执行的域 该域与环境具有 1 1 关系 为了简化它 测试网 www UAT com www prod com 在 App config 中我有类似的内容
  • C 字符串初始值设定项不包含终止符?

    我对以下 C 代码片段有点困惑 printf Peter string is d bytes n sizeof Peter Peter string is 6 bytes 这告诉我 当 C 编译双引号中的字符串时 它会自动为空终止符添加一个
  • 将 youtube url 转换为 iframe 嵌入代码

    我一直在尝试找到一个正则表达式模式来用 iframe 嵌入代码 C 替换字符串中的所有 youtube URL 显然必须提取视频 ID 以下是应匹配的 url 模式 http www youtube com watch v bSiDLCf5
  • 如何访问 WPF Canvas 类的子级?

    如何访问 WPF Canvas 类的子级 这是一门很酷的课程 我喜欢你添加孩子的方式 但是一旦它们存在 您如何查看它们以阅读它们的状态和内容 我知道如果将孩子放在 XAML 中会很容易 但是 如果您在运行时动态地将子项添加到画布中该怎么办
  • 如何继承并实现以抽象类为参数的纯虚方法?

    我有一个抽象类Node其中包含纯虚拟方法存根matches 需要另一个实例Node 即子类化的事物的实例Node 作为参数 class Node forward declaration class Node public Node pare
  • C++ 中 IsA() 有什么意义?

    我试图弄清楚为什么一些代码库使用 IsA 来确定对象多态性 如果在 C 中你已经可以安全地向上转换和向下转换 使用dynamic cast 到目前为止 我认为唯一有用的情况是当您集成链接到 C 代码库的脚本环境时 Thanks 原因很少 并
  • 模板类中的模板函数

    我有这个代码 template
  • MonoTouch.Dialog:UISearchBar 颜色

    在 3 月 31 日发布的 MonoTouch Dialog 中 我们无法设置UISearchBar现在不再这样了 因为有一个带有硬编码颜色的新容器对象 有没有更简单的方法来改变颜色UISearchBar 作为解决方法 我使用它 知道 UI
  • FindNextFile 在 64 位 Windows 上失败?

    使用 C Builder 2007 FindFirstFile 和 FindNextFile 函数似乎无法在 64 位版本的 Vista 和 XP 上找到某些文件 我的测试应用程序是 32 位的 如果我使用它们遍历文件夹 C Windows
  • 将进程附加到远程 PC 上正在运行的进程

    我正在开发一个 C 应用程序 该应用程序在远程 PC 上运行 我有 VPN 连接并使用 RDP 会话 我可以登录到该计算机 在那台计算机上 在正在运行的进程旁边 还有两个 msvsmon exe 进程 在任务管理器中具有以下 命令行 条目
  • 在 OpenSceneGraph 中创建球体(使用 osg::Geometry)

    我花了相当长的时间才使其正常工作 但我的球体无法显示 使用以下代码来实现我的功能 使用 Visual C 在 Opengl 中创建 3D 球体 https stackoverflow com questions 5988686 creati
  • C# 4.0 的新酷功能 [已关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 你们正在寻
  • Cookie 未更新

    我正在尝试更新 cookie 值 但它不起作用 我尝试过的所有操作都不会更新 cookie 而且我总是得到 cookie 的初始值 所以我进行了搜索 根据 MSDN 我应该能够通过执行以下操作来更新 cookie HttpCookie co
  • 将“var”传递给另一个方法

    我可能完全错过了这里的重点 但是 如何将 var 传递给另一个方法 我正在使用 linq 将 XML 加载到可枚举对象列表中 我有不同的对象类型 具有不同的字段 但无论使用哪个对象 我的过程的最后一步都是相同的 XNamespace xml
  • 最小化时,窗口应用程序在任务栏上呈橙色闪烁

    我有一个窗口应用程序 当我最小化任务栏上的窗口应用程序以在另一个应用程序上工作时 我们有一种工具可以将消息从一个窗口应用程序发送到另一个窗口应用程序 因此 我的第一个 win 应用程序被最小化 现在我打开另一个 win 应用程序 然后向第一
  • 静态方法内的变量共享

    我对静态方法内的变量有疑问 静态方法内的变量是否共享相同的内存位置 或者它们有单独的内存吗 这是一个例子 public class XYZ Public Static int A int value int b value return b
  • ASP.NET Membership ChangePassword 控件 - 需要检查以前的密码

    我有一个保存旧密码的新表 我需要检查是否有匹配项 如果存在匹配项 我需要 ChangePassword 控件来不更改密码 我需要告诉用户该密码已被使用 并设置一个新密码 我似乎无法中断更改密码的控制 也许我使用了错误的事件 这是我的一段代码
  • `rand()` 的用处 - 或者谁应该调用 `srand()`?

    背景 我用的是rand std rand std random shuffle 以及我的代码中用于科学计算的其他函数 为了能够重现我的结果 我总是明确指定随机种子 并通过srand 直到最近我才发现 libxml2 也会调用srand 懒洋
  • HMC SHA1 哈希 - Java 生成与 C# 不同的哈希输出

    这是后续this https stackoverflow com questions 7175067 hmc sha1 hash c sharp producing different hash output than ruby问题 但我正

随机推荐

  • 005-1基于深度优先搜索查找图中连通路径

    基于图的深度优先搜索 图学习笔记索引 本文参考 算法 第4版 基于图的深度优先搜索 1 自定义输入流In 2 定义背包类Bag 3 无向图G的构造 4 深度优先搜索DepthFirstSearch 5 使用深度优先搜索查找连通路径Depth
  • Win7 X86上搭建Android开发环境

    Android SDK有Mac Linux和Windows三个平台的版本 处于个人习惯 决定在Win7 X86的电脑上搭建Android开发环境 windows平台搭建Android开发环境 需要以下相关安装包 1 JDK6 需下载并安装
  • Apollo 应用与源码分析:CyberRT-protobuf

    目录 概念 特点 优点 缺点 文件的创建 1 字段规则 2 数据类型 3 字段名称 4 字段编号 文件的编译 protobuf 编译命令编译 protobuf cmake 方式编译 使用bazel 编译 在protobuf 文件夹下创建bu
  • python实现超市商品销售管理系统

    class Goods object def init self id name price self id id self name name self price price def str self info 编号 s t商品名称 s
  • 使用VirtualBox安装Ubuntu虚拟机 - 完整教程

    前言 本教程将演示通过 VirtualBox 安装 Ubuntu 请提前下载好以下文件哦 VirtualBox 软件 Ubuntu 的 镜像文件 iso 下载地址 VirtualBox 版本 VirtualBox 7 0 2 官网链接 ht
  • eclipse常用快捷键

    Eclipse中10个最有用的快捷键组合 一个Eclipse骨灰级开发者总结了他认为最有用但又不太为人所知的快捷键组合 通过这些组合可以更加容易的浏览源代码 使得整体的开发效率和质量得到提升 1 ctrl shift r 打开资源 这可能是
  • 如何安装iGG

    优点 1 安装 iGG 不能访问视频网站 但可以支持GG学术 GG搜索进行学术研究 2 作为GG扩展程序客户端只用登陆一次 非常便捷 3 性价比高 充值会员手机端也可以安装使用 步骤
  • 学习大数据所需的关键知识

    在人工智能领域 学习大数据技术是一项重要的任务 随着数据的快速增长和各行各业对数据的需求不断增加 掌握大数据技术可以帮助我们有效地处理 存储和分析海量数据 本文将介绍学习大数据所需的关键知识 并提供相应的源代码示例 数据存储和处理 在学习大
  • 【背包问题】之01背包和完全背包

    文章目录 1 01 背包 1 1 题目描述 1 2 基本思路 1 3 空间上的优化 1 4 算法实现 1 5 递归版本 1 6 按照递归修改的动态规划版本 1 7 总结 2 完全背包 2 1 题目描述 2 2 基本思路 2 3 优化一下 2
  • C语言:冒泡排序法:将若干字符串按字母顺序(由小到大)排序输出

    include
  • 大二上详细计划(量化到周)

    目录 前言 统筹安排 每周量化 每周进度 总体 花絮 前言 1 思来想去 决定对大二上的四个月进行一个安排 量化每周任务 具体到一本书看多少页 一套视频学多少 每个节点任务完成度 2 我们都是思想上的巨人 行动上的矮子 各种各样的欲望会阻碍
  • SpringCloud:Gateway之StripPrefix使用

    StripPrefix 过滤配置 很多时候也会有这么一种请求 用户请求路径是 api goods 而真实路径是 goods 这时候我们需要去掉 api才是真实路径 此时可以使用StripPrefix功能来实现路径的过滤操作 如下配置 ser
  • c语言时间序列预测,2.5.2 扩展案例:预测离散值时间序列

    2 5 2 扩展案例 预测离散值时间序列 假设我们观察到取值为0或1的数据 每个时刻一个值 为了了解具体应用 假设这是每天的天气数据 1代表有雨 0代表没有雨 假设已经知道最近几天是否下雨 我们希望预测明天是否会下雨 具体而言 对于某个k值
  • C++指针

    指针是一个存放内存地址的变量 通过指针 可以间接操作其它变量 指针的常用操作 int a 0 定义一个变量 int p a 定义一个指针 并指向a p 1 通过指针间接操作a 此时a 1 注意 p的类型是int 访问区域为4字节 Ps in
  • Revit二次开发--过滤对象(Revit 2014)

    1 获取元素的ID 通过UIDocument的Selection属性获取当前视图中选中的元素的ID 类型 using System using System Collections Generic using System Linq usi
  • QT - QML 遇到 module “QtQuick.Controls“ version 2.5 is not installed 的相关问题的解决策略

    问题由来 在跟着视频敲代码时 需要用到 DelayButton 这个控件 因此需要导入相关的库模块 跟着视频敲的是import QtQuick Controls 2 5 但可能由于版本较低的原因没有安装这个库模块 根据输入提示 有个 imp
  • STM32F407的CAN通信实验CAN1CAN2的设置

    CAN2的初始化参照上一篇博文就OK了 需要修改的地方 配置过滤器 CAN FilterInitStructure CAN FilterNumber 14 那为什么要修改额 查datasheet 双 CAN CAN1 主 bxCAN 用于管
  • Flex应用程序启动详解

    编写一个简单的Flex应用程序并不复杂 就算你从来没接触过Flex程序设计 照着帮助的实例步骤 不需花多长时间也能做出一个漂亮简捷的小程序出来 不过 随着对Flex程序编写的深入 会越来越觉得 其实要编写一个好的Flex应用程序并不简单 涉
  • uniapp切片-可视化设计工具(一套代码编译到7个平台iOS、Android、H5、小程序)

    uni app 是一个使用 Vue js 开发跨平台应用的前端框架 开发者编写一套代码 可编译到iOS Android H5 小程序等多个平台 一套代码编到7个平台 难以置信吗 依次扫描7个二维码 亲自体验最全面的跨平台效果 uni app
  • C++之sort()函数详解,刷题必备~

    顾名思义 sort就是用来排序的函数 它根据具体情形使用不同的排序方法 效率较高 一般来说 不推荐使用C语言中的qsort函数 原因是qsort用起来比较烦琐 涉及很多指针的操作 而且sort在实现中规避了经典快速排序中可能出现的会导致实际