排序算法基础(未完待续)

4.1 排序

4.1.1 选择排序

4.1.2 插入排序

4.1.3 排序与sort函数的应用

sort函数参数

sort(首元素地址,尾元素的下一个元素的地址,比较函数(cmp,非必填))

如果不写比较函数,那默认对给定区间进行递增排序

如何实现比较函数

从基本数据类型、结构体类型、STL容器进行自定排序
(1)基本数据类型

如果不指定cmp函数则默认从小到大排序

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

如果逆序则>,正序<

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

(2)结构体数组

在 C++ 中,如果你想对一个结构体数组进行排序,并且需要自定义排序逻辑,你可以通过定义一个比较函数 cmp 来实现。这个比较函数将基于结构体的一个或多个属性来决定排序的顺序。下面是一个示例,展示如何对一个包含某些属性的结构体数组进行排序。

定义结构体

首先,我们定义一个简单的结构体,比如一个描述人的结构体,包含姓名和年龄:

#include <iostream>
#include <algorithm>
#include <vector>struct Person {std::string name;int age;
};

自定义比较函数

接下来,我们定义一个比较函数,这个函数可以基于年龄进行排序:

bool cmp(const Person &a, const Person &b) {return a.age < b.age; // 升序排序
}

或者,如果你想要根据姓名的字典顺序进行降序排序,可以这样写:

bool cmp(const Person &a, const Person &b) {return a.name > b.name; // 姓名的降序排序
}

使用 sort 函数

最后,你可以创建一个 Person 类型的数组或向量,并使用 sort 函数与自定义比较函数来排序:

int main() {std::vector<Person> people = {{"Alice", 30},{"Bob", 25},{"Charlie", 35}};// 根据年龄升序排序std::sort(people.begin(), people.end(), cmp);// 输出排序后的结果for (const auto &person : people) {std::cout << person.name << " is " << person.age << " years old.\n";}return 0;
}

(3)综合应用

1.定义相关结构体

struct student{char name[10];char id[10];int score;int r;//排名
}stu[100000];

2.cmp函数的编写

解释

  • 按分数排序:如果两个学生的分数不同 (a.score != b.score),函数将根据分数的降序来比较学生。这意味着分数较高的学生将排在分数较低的学生之前。

  • 按名字排序:如果两个学生的分数相同,那么 cmp 函数使用 strcmp 函数来比较他们的名字。strcmp 函数返回一个整数来表示两个字符串的比较结果:

    • 如果返回值小于 0,表示第一个字符串在字典序中位于第二个字符串之前。
    • 如果返回值等于 0,表示两个字符串相等。
    • 如果返回值大于 0,表示第一个字符串在字典序中位于第二个字符串之后。

因此,strcmp(a.name, b.name) < 0 表示如果 a.name 在字典序中早于 b.name,则应该返回 true,即 a 应该在 b 前面。

bool cmp(Student a,Student b){if(a.score!=b.score) return a.score>b.score;else return strcmp(a.name,b.name)<0;
}

3.排名的实现

int r = 1;
for(int i = 0;i<n;i++){if(i>0&&stu[i].score!=stu[i-1].score){r = i+1;}stu[i].r = r;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/871336.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

注意力机制篇 | YOLOv8改进之在C2f模块引入Global Context注意力模块 | 全局上下文注意力机制

前言:Hello大家好,我是小哥谈。GCNet(Global Context Network)是由XV Jiарui开发的一个开源项目,它旨在通过全局上下文信息增强网络的注意力机制,以改善模型对图像的理解和处理能力。它的核心思想是在每个残差块之后添加一个全局上下文模块(即本文的Global Context注意…

【Quart 框架——来源于Flask的强大且灵活的异步Web框架】

目录 前言一、Quart简介1-1、简介1-2、与flask的区别 二、快速开始2-1、安装2-2、基本用法 三、核心功能3-1、异步路由3-2、WebSockets 支持3-3、中间件3-4、蓝图 (Blueprints) 四、部署4-1、使用uvicorn部署4-2、使用hypercorn部署 五、案例分析总结 前言 Quart 是一个基于 Py…

【Python】爬虫实战01:获取豆瓣Top250电影信息

本文中我们将通过一个小练习的方式利用urllib和bs4来实操获取豆瓣 Top250 的电影信息&#xff0c;但在实际动手之前&#xff0c;我们需要先了解一些关于Http 请求和响应以及请求头作用的一些知识。 1. Http 请求与响应 HTTP&#xff08;超文本传输协议&#xff09;是互联网上…

虚函数__

10 文章目录 虚函数虚函数表override(不允许后续函数继承)虚析构纯虚函数 虚函数 虚函数表 override(不允许后续函数继承) 虚析构 纯虚函数

从零开始学习PX4源码3(如何上传官网源码到自己的仓库中)

目录 文章目录 目录摘要1.将PX4源码上传至腾讯工蜂2.从腾讯工蜂克隆源码到本地ubuntu3.如何查看自己源码的版本信息 摘要 本节主要记录从零开始学习PX4源码3(如何上传官网源码到自己的仓库中)及如何查看PX4的固件版本信息&#xff0c;欢迎批评指正&#xff01; PX4源码版本V1.…

构建新纪元:Gradle中Kotlin插件的配置全指南

构建新纪元&#xff1a;Gradle中Kotlin插件的配置全指南 引言 Kotlin&#xff0c;这门现代、简洁的语言&#xff0c;正在逐渐成为Java平台的有力补充。随着Kotlin在Android开发中的广泛采用&#xff0c;以及对服务器端和Web开发的支持&#xff0c;Kotlin插件在Gradle中的配置…

mysql-联合查询

一.联合查询的概念 .对于unio查询,就是把多次查询的结果合并起来,形成一个新的查询果集。 SELECT 字段列表 FROM 表A... UNION[ALL] SELECT 字段列表 FROM 表B...&#xff0c; 二.将薪资低于5000的员工,和年龄大于50岁的员工全部查询出来 select * from emp where salary&…

无人机的工作原理

无人飞行器&#xff08;UAV&#xff0c;即Unmanned Aerial Vehicle&#xff09;的工作原理涉及多个复杂的系统和技术。以下是对各个系统和技术的详细介绍&#xff1a; 1. 飞行控制系统&#xff08;FCS&#xff09; 飞行控制系统是无人机的“大脑”&#xff0c;负责监控和调整…

【Android】在渲染生效前提前测量View大小

问题 Android的UI机制是基于MessageHandler的&#xff0c;View并不会在添加后就会被立刻测量渲染出来 但有时我们需要动态去计算布局&#xff0c;希望在添加View时&#xff0c;就能知道这个View的高度 方法 此时&#xff0c;我们可以手动去调用measure方法&#xff0c;来测…

使用 Apache Pulsar 构建弹性可扩展的事件驱动应用

本视频来自 2024 Apache Pulsar 欧洲峰会&#xff0c;由 David Kjerrumgaard, 《Pulsar in Action》书作者给大家带来的《使用 Apache Pulsar 构建弹性可扩展的事件驱动应用》分享。 嘉宾&#xff5c;David Kjerrumgaard&#xff0c;Apache Pulsar Committer&#xff0c;《Pul…

总结单例模式的写法

一、单例模式的概念 1.1 单例模式的概念 单例模式&#xff08;Singleton Pattern&#xff09;是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式&#xff0c;它提供了一种创建对象的最佳方式。就是当前进程确保一个类全局只有一个实例。 1.2 单例模式的优…

基于php+mysql的简单图书管理系统(附源码)

一、模块设计 二、技术选型 IDE&#xff1a;phpstorm mysql&#xff1a;5.1 php&#xff1a;7.3.29 运行工具&#xff1a;phpstudy 三、数据库设计 用户表&#xff1a; CREATE TABLE t_user (id int(11) NOT NULL AUTO_INCREMENT,uname varchar(255) DEFAULT NULL,upass…

C语言的神髓

​​​​​​​ ​​​​​​​

JAVA-报表模糊搜索询易实现

背景: 一般文件报表经常会需要搜各个表头对应内容&#xff0c;如果支持全部类型切换搜索&#xff0c;操作起来就不够便捷。而且这个报表是测试自己用的&#xff0c;准确性可以不用太要求&#xff0c;所以更想要那中输入关键字命中任意表记录内容的模糊匹配功能。 方法一:解析搜…

记录些Redis题集(3)

分布式锁 分布式锁是一种用于在分布式系统中实现互斥访问的机制&#xff0c;它可以确保在多个节点、或进程同时访问共享资源。如果没有适当的锁机制&#xff0c;就可能导致数据不一致或并发冲突的问题。 分布式锁需要的介质 需要一个多个微服务节点都能访问的存储介质&#…

matine组件库踩坑日记 --- react

Mantine实践 一 禁忌核心css样式二 添加轮播图扩展组件 一 禁忌核心css样式 import React from react import ReactDOM from react-dom/client import { BrowserRouter } from react-router-dom; import App from ./App.jsx import ./index.css import mantine/core/styles.cs…

RocketMQ~架构了解

简介 RocketMQ 具有高性能、高可靠、高实时、分布式 的特点。它是一个采用 Java 语言开发的分布式的消息系统&#xff0c;由阿里巴巴团队开发&#xff0c;在 2016 年底贡献给 Apache&#xff0c;成为了 Apache 的一个顶级项目。 在阿里内部&#xff0c;RocketMQ 很好地服务了集…

DHCPv6 详情及其报文介绍 - 附配置案例及验证命令(Cisco)

DHCPv6 诞生的原因 IPv6 协议具有地址空间巨大的特点&#xff0c;但同时长达 128 比特的 IPv6 地址又要求高效合理的地址自动分配和管理策略。IPv6 无状态地址配置方式&#xff08;RFC2462&#xff09;是目前广泛采用的 IPv6 地址自动配置方式。配置了该协议的主机只需相邻设备…

Vue2 vs Vue3:抉择的艺术 —— 学习路线全解析

在前端开发的浩瀚星海中&#xff0c;Vue.js 无疑是一颗璀璨夺目的明星。随着 Vue3 的横空出世&#xff0c;许多开发者陷入了纠结&#xff1a;我应该学习 Vue2 还是 Vue3&#xff1f;两者之间的差异何在&#xff1f;本文将深入探讨 Vue2 与 Vue3 的特点、应用场景及学习建议&…

红日靶场----(三)1.漏洞利用

上期已经信息收集阶段已经完成&#xff0c;接下来是漏洞利用。 靶场思路 通过信息收集得到两个吧靶场的思路 1、http://192.168.195.33/phpmyadmin/&#xff08;数据库的管理界面&#xff09; root/root 2、http://192.168.195.33/yxcms/index.php?radmin/index/login&am…