快速排序&Lambda表达式

快速排序

912. 排序数组

#include <iostream>
#include <vector>
#include <ctime>
#include <algorithm> // 用于交换函数swapusing namespace std;class Solution {
public:// 函数功能:对给定数组nums的指定区间[l, r]进行划分操作,用于快速排序// 参数说明:// nums:待排序的整数数组// l:区间左边界索引// r:区间右边界索引// 返回值:划分点的索引,使得划分点左边的元素都小于等于它,右边的元素都大于等于它int partition(vector<int>& nums, int l, int r) {// 选择区间的第一个元素nums[l]作为参照点(枢轴)int flag = nums[l];// 初始化指针i,从参照点的下一个位置开始,用于划分小于等于参照点的元素区域int i = l + 1;// 初始化指针j,从区间的右端点开始,用于划分大于等于参照点的元素区域int j = r;// 循环进行划分操作,直到i和j相遇while (true) {// 从左向右找第一个大于参照点的元素// 只要i还在有效区间内(i <= j)且当前元素nums[i]小于等于参照点,就继续向右移动iwhile (i <= j && nums[i] <= flag) {i++;}// 从右向左找第一个小于参照点的元素// 只要i还在有效区间内(i <= j)且当前元素nums[j]大于等于参照点,就继续向左移动jwhile (i <= j && nums[j] >= flag) {j--;}// 如果i大于j,说明已经完成了一次划分,此时小于等于参照点的元素都在左边,大于等于参照点的元素都在右边if (i > j) {break;}// 交换找到的两个元素,即把大于参照点的nums[i]和小于参照点的nums[j]进行交换// 这样可以使得左边的元素逐渐趋向于都小于等于参照点,右边的元素逐渐趋向于都大于等于参照点swap(nums[i], nums[j]);// 交换后,移动指针i和j,继续下一轮的查找和交换操作i++;j--;}// 将参照点放到正确的位置,即与j所指向的元素交换// 此时j所指向的位置就是参照点在排序后应该处于的位置,使得左边元素都小于等于它,右边元素都大于等于它swap(nums[l], nums[j]);// 返回划分点的索引return j;}// 函数功能:在给定数组nums的指定区间[l, r]内随机选择一个元素作为参照点,并进行划分操作// 参数说明:// nums:待排序的整数数组// l:区间左边界索引// r:区间右边界索引// 返回值:划分点的索引,使得划分点左边的元素都小于等于它,右边的元素都大于等于它int randomized_partition(vector<int>& nums, int l, r) {// 随机选一个位置和区间中的第一个位置交换,相当于随机选位// 生成一个在区间[l, r]内的随机索引iint i = rand() % (r - l + 1) + l;// 将随机选到的元素与区间的第一个元素nums[l]交换,使得第一个元素成为随机选取的参照点swap(nums[l], nums[i]);// 调用partition函数进行划分操作,并返回划分点的索引return partition(nums, l, r);}// 函数功能:对给定数组nums的指定区间[l, r]进行快速排序// 参数说明:// nums:待排序的整数数组// l:区间左边界索引// r:区间右边界索引// 无返回值,通过递归调用对数组进行排序,排序结果直接在原数组nums上体现void randomized_quicksort(vector<int>& nums, int l, int r) {// 如果区间左边界小于右边界,说明区间内至少有两个元素,需要进行排序if (l < r) {// 先进行随机划分操作,得到划分点的索引posint pos = randomized_partition(nums, l, r);// 对划分点左边的子区间[l, pos - 1]进行快速排序randomized_quicksort(nums, l, pos - 1);// 对划分点右边的子区间[pos + 1, r]进行快速排序randomized_quicksort(nums, pos + 1, r);}}// 函数功能:对给定的整数数组nums进行排序,并返回排序后的数组// 参数说明:// nums:待排序的整数数组// 返回值:排序后的整数数组vector<int> sortArray(vector<int>& nums) {// 设置随机数生成器的种子,根据当前时间生成随机数序列// 这样每次运行程序时,随机选取参照点的操作都会有不同的结果,避免排序算法陷入最坏情况srand((unsigned)time(NULL));// 调用randomized_quicksort函数对整个数组进行快速排序,区间为[0, nums.size() - 1]randomized_quicksort(nums, 0, nums.size() - 1);// 返回排序后的数组return nums;}
};

什么是 C++ 中的 Lambda 表达式?它的作用是什么?

  • 定义
    • Lambda 表达式是 C++11 引入的一种匿名函数。它可以在需要函数对象(如函数指针、std::function对象等)的地方定义和使用一个临时的函数。Lambda 表达式的语法形式如下:
[capture - list](parameters) mutable(optional) exception - specification(optional) -> return - type(optional) {function - body
}
  • 其中,[capture - list]是捕获列表,用于指定在 Lambda 函数体中可以访问的外部变量;(parameters)是参数列表,和普通函数的参数列表类似,用于接收传入的参数;mutable关键字是可选的,用于修改按值捕获的变量(如果没有mutable,按值捕获的变量在 Lambda 函数体内是不可修改的);exception - specification是可选的异常规范;-> return - type是可选的返回类型指定部分;function - body是函数体,包含了 Lambda 表达式要执行的具体代码。
  • 作用
    • 作为回调函数使用:在很多 C++ 标准库算法(如std::for_eachstd::transform等)中,需要提供一个函数对象来定义对容器元素的操作。Lambda 表达式可以方便地在调用这些算法的地方直接定义操作函数,而不需要单独定义一个函数或者函数对象类。例如:
#include <iostream>
#include <vector>
#include <algorithm>
int main() {std::vector<int> numbers = {1, 2, 3, 4, 5};std::for_each(numbers.begin(), numbers.end(), [](int n) {std::cout << n * n << " ";});return 0;
}
  • 在这个例子中,std::for_each算法遍历numbers向量中的每个元素,并对每个元素执行 Lambda 表达式定义的操作(这里是输出元素的平方)。
  • 局部函数定义:当需要在一个函数内部定义一个临时使用的函数,并且这个函数的定义比较简单,不需要在多个地方复用的时候,Lambda 表达式可以提供简洁的定义方式。例如,在一个函数中,需要根据不同的条件计算不同的表达式,使用 Lambda 表达式可以避免定义多个小的辅助函数。
  • 封装代码逻辑:可以将一些简单的逻辑封装在 Lambda 表达式中,提高代码的可读性和可维护性。例如,在排序操作中,可以使用 Lambda 表达式来定义比较规则。

Lambda 表达式可以捕获哪些类型的变量?有哪些捕获方式?

 

  • 捕获类型
    • 值捕获:可以捕获外部变量的值。例如,int x = 10; auto lambda = [x]{ std::cout << x << std::endl; };,这里的lambda捕获了x的值。在 Lambda 函数体中使用的是x被捕获时的值。
    • 引用捕获:可以捕获外部变量的引用。例如,int y = 20; auto lambda = [&y]{ y++; std::cout << y << std::endl; };,这里的lambda捕获了y的引用,在 Lambda 函数体中可以修改y的值。
  • 捕获方式
    • 空捕获列表[]:表示不捕获任何外部变量,此时 Lambda 表达式内部不能访问外部变量。例如,auto lambda = []{ std::cout << "No external variables captured." << std::endl; };
    • 值捕获[x][x, y, z]:按值捕获指定的外部变量。这些变量的值在 Lambda 表达式定义时被复制到 Lambda 函数内部,在 Lambda 函数内部对这些变量的修改不会影响外部的原始变量(除非使用mutable关键字)。例如,int a = 3; int b = 4; auto lambda = [a, b]{ std::cout << a + b << std::endl; };
    • 引用捕获[&x][&x, &y, &z]:按引用捕获指定的外部变量。在 Lambda 函数内部对这些变量的修改会影响外部的原始变量。例如,int m = 5; int n = 6; auto lambda = [&m, &n]{ m++; n++; std::cout << m + n << std::endl; };
    • 默认值捕获[=]:按值捕获 Lambda 表达式所在作用域内的所有变量。例如,int p = 7; int q = 8; auto lambda = [=]{ std::cout << p * q << std::endl; };
    • 默认引用捕获[&]:按引用捕获 Lambda 表达式所在作用域内的所有变量。例如,int r = 9; int s = 10; auto lambda = [&]{ r--; s--; std::cout << r + s << std::endl; };。这种方式需要谨慎使用,因为可能会导致意外的变量修改。

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

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

相关文章

网络层协议IP

对于网络层我们直接通过IP协议来了解其内容 一.IP协议 首先我们先来了解几个概念&#xff1a; 主机&#xff1a;配有IP地址&#xff0c;但是不进行路由控制的设备 路由器&#xff1a;配有IP地址&#xff0c;同时进行路由控制的设备 节点&#xff1a;主机和路由器的统称 所以现在…

cryptography与zlib系列:数据分块解密与解压

cryptography与zlib系列&#xff1a;数据分块解密与解压 数据分块压缩与加密可以查看我的另外一篇博客&#xff0c;这里与之相对应的是解密与解压的操作。解压之后的数据转为BytesIO对象用于后续读取&#xff0c;适用于大部分数据格式&#xff0c;而不需要从文件中读取。 完整…

react函数式组件中的路由传参方式

React Router 提供了多种方式来传递路由参数&#xff1a; URL 路径参数&#xff1a;通过动态路由和 useParams 获取。查询参数&#xff1a;通过 useLocation 获取 URL 查询字符串。路由状态传递&#xff1a;通过 state 属性在导航时传递数据&#xff0c;不在 URL 中显示&#…

八股文-基础知识-面试题汇总(一)

面向对象和面向过程的区别&#xff1f; 面向对象和面向过程是两种不同的编程范式&#xff0c;它们在设计和实现软件时有着不同的理念和方法。面向对象更适合大型、复杂的项目&#xff0c;尤其是需要维护和扩展的系统&#xff1b;而面向过程更适合小型、线性的任务或对性能要求…

道品智能科技移动式水肥一体机:农业灌溉施肥的革新之选

在现代农业的发展进程中&#xff0c;科技的力量正日益凸显。其中&#xff0c;移动式水肥一体机以其独特的可移动性、智能化以及实现水肥一体化的卓越性能&#xff0c;成为了农业领域的一颗璀璨新星。它不仅改变了传统的农业灌溉施肥方式&#xff0c;更为农业生产带来了高效、精…

数据结构 (10)队列

前言 队列是一种特殊的数据结构&#xff0c;它遵循先进先出&#xff08;FIFO&#xff0c;First In First Out&#xff09;的原则。 一、定义与基本概念 定义&#xff1a;队列是一种只允许在一端&#xff08;队尾&#xff09;进行插入操作&#xff0c;而在另一端&#xff08;队头…

C#中的异步操作

在 C# 中&#xff0c;异步编程主要是通过 async 和 await 关键字实现的&#xff0c;它们使得异步操作变得更加简洁和易于维护。以下是关于异步线程用法的基本介绍&#xff0c;以及如何编写一个异步函数的步骤和示例。在之前的项目中我其实一直在用这些异步的方法&#xff0c;今…

Python3 WebUI自动化总篇:Python3+Selenium+Pytest+Allure+ Jenkins webUI自动化框架

Python3 WebUI自动化总篇: Python3+Selenium+Pytest+Allure+ Jenkins webUI自动化框架 WebUI接口框架使用的工具

【数据分享】2001-2023年我国30米分辨率冬小麦种植分布栅格数据(免费获取)

小麦、玉米、水稻等各类农作物的种植分布数据在农业、环境、国土等很多专业都经常用到&#xff01; 本次给大家分享的是我国2001-2023年逐年的30米分辨率冬小麦种植分布栅格数据&#xff01;数据格式为TIFF格式&#xff0c;数据坐标为GCS_WGS_1984。该数据包括我国11个省份的冬…

Linux和Ubuntu的关系

Linux和Ubuntu的关系&#xff1a; 1. Linux本身是内核&#xff0c;Ubuntu系统是基于Linux内核的操作系统。 2. Linux内核操作系统的构成&#xff1a; 内核、shell、文件系统、应用程序 -应用程序&#xff1a;文本编辑器等 -文件系统&#xff1a;文件存放在存储设备上的组织方…

17.5k Star,ThingsBoard 一款开源、免费、功能全面的物联网 IoT 平台 -慧知开源充电桩平台

项目介绍 ThingsBoard是一个开源、免费、功能全面、灵活易用的物联网&#xff08;IoT&#xff09;平台&#xff0c;专注于数据收集、处理、可视化以及设备管理。它提供了一个全面的解决方案&#xff0c;用于构建和管理物联网应用。支持从各种设备收集数据&#xff0c;通过内置…

力扣面试150 填充每个节点的下一个右侧节点指针 II BFS 逐层构建法

Problem: 117. 填充每个节点的下一个右侧节点指针 II &#x1f37b; BFS 空间优化 &#x1f469;‍&#x1f3eb; 参考题解 ⏰ 时间复杂度: O ( n ) O(n) O(n)&#x1f30e; 空间复杂度: O ( 1 ) O(1) O(1) class Solution {public Node connect(Node root) {if (root …

Applicaiton配置文件

server:port: 8080 # 配置 Spring Boot 启动端口&#xff0c;默认为 8080mybatis-plus:mapper-locations: classpath:com/xtl/mapper/xml/*.xml # 指定 MyBatis Mapper XML 文件的路径&#xff0c;确保 MyBatis 能够正确加载 Mapper 文件global-config:db-config:id-type: au…

网络安全:攻击和防御练习(全战课), DDos压力测试

XSS 跨站脚本攻击&#xff1a; Cross-site scripting&#xff08;简称xss&#xff09;跨站脚本。 一种网站的安全漏洞的攻击&#xff0c;代码注入攻击的一种。XSS攻击通常指的是通过利用网页开发时留下的漏洞&#xff0c;通过巧妙的方法注入恶意指令代码到网页&#xff0c;使…

文本显示text

文本显示 text是文本组件 创建文本 Text(基础语法)// 引用字符串Text($r(app.string.hella))添加子组件 span能作为Text和RichEditor组件的子组件显示文本内容。 创建span span组建需要写在text组件里面&#xff0c;无法单独使用&#xff0c;可以写多个子组件 Text(可…

ElasticSearch学习篇18_《检索技术核心20讲》LevelDB设计思想

目录 一些常见的设计思想以及基于LSM树的LevelDB是如何利用这些设计思想优化存储、检索效率的。 几种常见的设计思想 索引和数据分离减少磁盘IO读写分离分层思想 LevelDB的设计思想 读写分离设计分层设计与延迟合并LRU缓存加速检索 几种常见设计思想 索引与数据分离 索引…

LabVIEW Real-Time 的特点

LabVIEW Real-Time&#xff08;简称 LabVIEW RT&#xff09;是为实时系统设计的软件平台&#xff0c;结合 NI 硬件&#xff08;如 CompactRIO 和 PXI 系列&#xff09;&#xff0c;能够在高可靠性、高性能要求的场景中实现稳定的实时控制与数据处理。以下是它的主要用处和特点&…

使用脚本实现hadoop-yarn-flink自动化部署

本文使用脚本实现hadoop-yarn-flink的快速部署&#xff08;单机部署&#xff09;。 环境&#xff1a;①操作系统&#xff1a;CentOS 7.6&#xff1b;②CPU&#xff1a;x86&#xff1b;③用户&#xff1a;root。 1.前置条件 把下面的的脚本保存到“pre-install.sh”文件&#x…

【JUC-Interrupt】中断相关概念

线程中断 一、相关概念二、API2.1、isInterrupted方法2.2、interrupted方法2.3、interrupt 三、总结&#xff1a; 一、相关概念 一个线程不应该由其他线程中断或停止&#xff0c;应该有线程自己来决定。 在Java中没有办法立即停止一个线程&#xff0c;因此提供了用于停止线程…

javascript基础学习

什么是伪代码 伪代码(Pseudocode)是一种介于自然语言和编程语言之间的算法描述方式。它使用类似自然语言的语句来描述程序的逻辑和流程,但又采用了编程语言中的一些结构和控制语句,如循环、条件判断等。 伪代码的目的是在不涉及具体编程语言语法细节的情况下,清晰地表达…