快速排序(递归)

快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法,其基本思想为:任取待排序元素序列中的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右子序列中所有元素均大于基准值,然后最左右子序列重复该过程,直到所有元素都排列在相应位置上为止。

下面通过图解的形式来帮助理解:

图中的key便是基准值对应的下标,L和R分别是左边和右边的下标,在下面那个图解里是实现升序,基本步骤就是先让R走,R需要找比key对应的数小的数,只要大于就一直往前走,直到找到小的或者跟L相遇就停下来;然后是L走,它要找到比key对应的数大的数,直到找到或者跟R相遇就停下来。

从上图中我们可以看到,L和R一直走,总会相遇,相遇后,将key对应的数与相遇处的数交换,并将key(基准值下标)置为相遇处的下标,因为此时相遇处的数是 已经排在了它对应的位置的,即左边的数都比它小,右边的数都比它大。然后,我们用递归,再将key左边部分的数和右边部分的数进行排序。

快速排序的大概思路就是这样啦,接下来我们上代码。

void QuickSort(int* a, int left, int right)
{
	//只有一个元素或者不存在
	if (left >= right)
		return;

	//保存起始位置和末尾位置
	int begin = left, end = right;

	int key = left;  //key为起始位置
	
	while (left < right)
	{
		//右边先走
		//注意left < right这个条件,在自增过程中left可能一直加,加到超过right
		while (left < right && a[right] >= a[key])
		{
			right--;
		}

		while (left < right && a[left] <= a[key])
		{
			left++;
		}

		swap(&a[left], &a[right]);
	}

	//出循环后,left = right
	//交换相遇点处的数据和key对应的数据,此时右侧数据大于a[key],左侧小于a[key]
	swap(&a[key], &a[left]);  //交换后a[key]就排好了,在正确的位置

	key = left;

	//递归,排a[key]左侧和右侧的数据
	//排左边
	QuickSort(a, begin, key - 1);

	//排右边
	QuickSort(a, key + 1, end);
}

我们来画一下递归展开图帮助理解:  

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

哲♂学家带你深♂入了♂解结构体及结构体内存大小问题

目录 概要 一、结构体的声明 二、结构体变量的创建和初始化 三、结构体的特殊声明 四、结构体内存对齐 1、对齐原则 2、例一 对齐数 计算方法 3、例二 总结 概要 结构体是我们日常编程中经常要用到的一种自定义类型&#xff0c;使用起来也是十分的方便。接下来就由…

Git常用操作命令

Git常用操作命令 前言 Git是一个分布式版本控制系统&#xff0c;用于跟踪和管理软件开发项目的版本历史。Git 是我们日常工作中使用频率极高的工具&#xff0c;各种指令让人眼花缭乱&#xff0c;这里对Git的一些相关命令进行总结。 常用命令 一般来说&#xff0c;日常使用g…

今日AI:Gemini Pro1.5向所有人开放;Stable Diffusion核心团队集体离职;HeyGen5.0上线视频翻译功能;剪映内测视频翻译功能

欢迎来到【今日AI】栏目!这里是你每天探索人工智能世界的指南&#xff0c;每天我们为你呈现AI领域的热点内容&#xff0c;聚焦开发者&#xff0c;助你洞悉技术趋势、了解创新AI产品应用。 新鲜AI产品点击了解&#xff1a;AIbase - 智能匹配最适合您的AI产品和网站 &#x1f91…

十七、LockSupport

TestLockSupport 淘宝面试题&#xff1a;实现一个容器,提供两个方法,add,size。写两个线程,线程1添加10个元素到容器中,线程2实现监控元素的个数,当个数到5个时,线程2给出提示并结束面试题:写一个固定容量同步容器,拥有put和get方法,以及 getcount方法,能够支持2个生产者线程以…

企业数字化转型:是竞争力的关键,还是行业炒作?

企业作为市场经济活动的核心主体&#xff0c;其角色已经从传统的资源集聚和生产组织形式逐步演变为数据驱动、智能决策的创新引擎。数字化转型对于企业而言&#xff0c;并非炒作概念&#xff0c;而是实实在在提升竞争力的关键路径。 什么是企业&#xff1f; 企业是市场经济体系…

网络安全是什么? 为什么要学网络安全 ?网络安全怎么学习?

网络安全是什么&#xff1f; 网络安全是指保护计算机网络、网络设备、应用程序、数据和用户免受非法访问、攻击、破坏或泄漏的过程和技术。网络安全包括多个领域&#xff0c;例如网络防御、漏洞管理、加密技术、身份验证和访问控制等等。 网络安全非常重要&#xff0c;因为现…

【C++】string类模拟实现

个人主页 &#xff1a; zxctscl 如有转载请先通知 文章目录 1. 前言2. 构造函数和析构函数3. 遍历3.1 下标[]3.2 迭代器 4. Modifiers4.1 push_back和append4.2 4.3 insert4.4 erase4.5 swap 5.Capacity5.1 resize5.2 clear 6. 深浅拷贝6.1 浅拷贝&#xff08;值拷贝&#xff0…

【MySQL】基本查询(1)

【MySQL】基本查询&#xff08;1&#xff09; 目录 【MySQL】基本查询&#xff08;1&#xff09;表的增删改查Create单行数据 全列插入多行数据 指定列插入插入否则更新替换 RetrieveSELECT 列全列查询指定列查询查询字段为表达式为查询结果指定别名结果去重 WHERE 条件英语不…

【MySQL】3.2MySQL事务和存储引擎

MySQL事务 一、MySQL事物的概念 事务是一种机制&#xff0c;包含了一件事的完整的一个过程 ●事务是一种机制、一个操作序列&#xff0c;包含了一组数据库操作命令&#xff0c;并且把所有的命令作为一个整体一起向系统提交或撤销操作请求&#xff0c;即这一组数据库命令要么…

关于java字节码文件加载过程中,各种变量和常量的存储位置

java变量存储位置 前提 下面的东西都是在jdk1.8基础上做出的探究 首先我们先解释一下在各种网站上出现的一些名词到底是什么&#xff1f; 1.字面量&#xff1a;声明为final的int、long、double、char等基本类型的常量值&#xff08;如final int a 1 这是一个常量值&#x…

宝塔面板系列——两种方式安装青龙面板

因为最近旧windows服务器到期了&#xff0c;在搬服务器&#xff0c;新服务器尝试用Linux系统。过程中有很多不懂的地方&#xff0c;只能边搬迁边学边弄&#xff0c;顺带记录下来&#xff0c;哪天又要搬迁了&#xff0c;翻翻自己的文章也就一应俱全了。 非科班出身&#xff0c;选…

yarn安装包时报错error Error: certificate has expired

安装教程&#xff1a; 配置镜像地址&#xff1a; npm config set registry https://registry.npmmirror.com//镜像&#xff1a;https://developer.aliyun.com/mirror/NPM 安装yarn&#xff1a; npm install --global yarn查看版本&#xff1a; yarn --version卸载&#xff…

力扣题库27题移除元素(c语言)

解法&#xff1a; int removeElement(int* nums, int numsSize, int val) {int src0,dst0;while(src<numsSize){if(nums[src]val){src;}else{nums[dst]nums[src];src;dst;}}return dst; }

Vue el-table 合并单元格

一般常见的就是下图这种的单列&#xff0c;上下重复进行合并。 有时候可能也会需要多行多列的合并。 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content&qu…

搭建GItlab实现自动化部署Springboot项目(超详细)

提示&#xff1a;本例程中使用Docker搭建GItlab&#xff0c;Gitlab runner 通过编写CICD文件实现Springboot项目自动部署。 1、拉取GitLab镜像 命令&#xff1a; docker pull gitlab/gitlab-ce2、部署Gitlab&#xff1a; 我们通过docker搭建的gitlab部署项目的时候会出现一个…

Springboot+Vue前后端分离的在线商城系统

项目介绍 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本ONLY在线商城系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据…

PHP页面如何实现设置独立访问密码

PHP网页如果需要查看信息必须输入密码&#xff0c;验证后才可显示出内容的代码如何实现&#xff1f; 对某些php页面设置单独的访问密码,如果密码不正确则无法查看内容,相当于对页面进行了一个加密。 如何实现这个效果&#xff0c;详细教程可以参考&#xff1a;PHP页面如何实现…

从零开始学习在VUE3中使用canvas(二):fillStyle(填充样式)

一、fillStyle概念 在canvas中我们可以用fillStyle定义接下来的图像的样式&#xff0c;默认为黑色#000。 我们可以使用纯色、渐变、和纹理&#xff08;例如图片&#xff09;进行填充&#xff0c;来达到自己想要的效果。 二、代码 <template><div class"canva…

ideaSSM 工厂效能管理系统bootstrap开发mysql数据库web结构java编程计算机网页源码maven项目

一、源码特点 idea 开发 SSM 工厂效能管理系统是一套完善的信息管理系统&#xff0c;结合SSM框架和bootstrap完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用SSM框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统具有完整的源代码和数据库&#xff…

测试开发工程师(QA)职业到底需要干些什么?part2:服务端QA

服务端QA测试开发工作主要涉及测试和确保服务端应用程序的质量、稳定性和性能。以下是服务端QA测试开发人员在工作中可能涉及的任务和职责 编写测试计划和测试用例&#xff1a;QA测试开发人员负责编写详细的测试计划和测试用例&#xff0c;以覆盖服务端应用程序的各个功能和场景…