数据结构与算法系列之快速排序

news2024/11/13 9:11:47

在这里插入图片描述

💗 💗 博客:小怡同学
💗 💗 个人简介:编程小萌新
💗 💗 如果博客对大家有用的话,请点赞关注再收藏 🌞

快速排序

快速排序是任取待排序元素序列中的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右子序列中所有元素均大于基准值,然后最左右子序列重复该过程,直到所有元素都排列在相应位置上为止

方法一

在这里插入图片描述
//代码实现

void  QuickSort(int* a, int left, int right)
{
	if (left >= right)
	{
		return;
	}
	int end = right;
	int begin = left;
	int key = left;
	while (left < right)
	{
	
		while (left < right && a[key] <= a[right])
		{
			right--;
		}
		while (left < right && a[key] >= a[left])
		{
			left++;
		}
		swap(&a[right], &a[left]);
	}
	swap(&a[key], &a[left]);
	PartSort1(a, begin, left - 1);
	PartSort1(a, left + 1, end);
}

//key的下标与开始遍历的方向是反方向 ,如果在同一方向 则会交换错误

在这里插入图片描述

//交换条件是left < right &&left <= right
1是保证在正确交换
2是left必须<= right
因为不带等号会陷入死循环

在这里插入图片描述

递归结束条件是 left >= right

在这里插入图片描述

方法二(挖坑法)

void QucikSort(int* a, int left, int right)
{
	if (left >= right)
	{
		return;
	}
	int key = a[left];
	int begin = left;
	int end = right;
	int hole = left;
	while (left <right)
	{
		while (left < right && a[right] >= key)
		{
			right--;
		}
		swap(&a[right], &a[hole]);
		hole = right;
		while (left < right && a[left] <= key)
		{
			left++;
		}
		swap(&a[left],&a[hole]);
		hole = left;
	}
	a[hole] = key;
	PartSort2(a, begin, hole - 1);
	PartSort2(a, hole + 1, end);
}

方法三(前后指针法)

void QuickSort(int* a, int left, int right)
{
	if (left >= right)
	{
		return;
	}
	int prev = left;
	int end  = left+1;
	int key = left;
	while (end <= right )
	{
		if (a[end] < a[key] &&  ++prev != end)
		{
			swap(&a[prev], &a[end]);
		}
		end++;
	}
	swap(&a[key], &a[prev]);
	PartSort3(a, left, prev - 1);
	PartSort3(a, prev + 1, right);
}

方法四(非递归法)

void QuickSort(int* a, int left, int right)
{
	Stack pq;
	StackInit(&pq);
	StackPush(&pq, right);
	StackPush(&pq, left);

	while (!StackEmpty(&pq))
	{
		int begin = StackTop(&pq);
		StackPop(&pq);
		int end = StackTop(&pq);
		StackPop(&pq);
		int key = QuickSort1(a, begin, end);
		if (key  < right -1)
		{
			StackPush(&pq, right);
			StackPush(&pq, key+1);
		}
		if(begin < key-1)
		{
			StackPush(&pq, key-1);
			StackPush(&pq, begin);
		}
	}
	StackDestory(&pq);
}

性能优化

当顺序与目标顺序是相反时,时间复杂度为o(N^2)

在这里插入图片描述

最后几次层栈的调用占据了调用的一大半,所以将最后几层优化

在这里插入图片描述

时间复杂度和稳定性

在这里插入图片描述

稳定性:不稳定
时间复杂度:NlogN
//共logN层
//n + (n-1) + (n-3) + …约等于NlogN

在这里插入图片描述

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

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

相关文章

【QT】TCP/UDP详解及实现

TCP/UDP TCP/IP模型TCP协议头部格式三次握手四次挥手 UDP协议头部格式 Socket编程tcpudp代码实现服务端&#xff1a;客户端&#xff1a; 总结 TCP/IP模型 TCP模型是一个常见的网络协议参考模型&#xff0c;也称为TCP/IP模型或互联网模型。它是指TCP/IP协议族中的一组协议&…

总结:Linux系统上面定时备份mysql指定数据库的解决方案

总结&#xff1a;Linux系统上面定时备份mysql指定数据库的解决方案 一Mysql数据库本身就自带备份数据库命令1.mysql本身自带备份数据库为一个sql文件的命令&#xff0c;只需要在操作系统的终端里面执行就好了 二Linux和Unix操作系统都自带一个定时任务执行器&#xff1a;cronta…

浅结反静态调试2

文章目录 SMC 自解码什么是SMC&#xff1f;原理示例动调 SMC 自解码 什么是SMC&#xff1f; 简而言之&#xff0c;就是程序中的部分代码在运行之前被加密成一段数据&#xff0c;不可反编译&#xff0c;通过程序运行后执行相关的解码功能&#xff0c;对加密的代码数据进行动态…

Linux :: vim 编辑器的初次体验:三种 vim 常用模式 及 使用:打开编辑、退出保存关闭vim

前言&#xff1a;本篇是 Linux 基本操作篇章的内容&#xff01; 笔者使用的环境是基于腾讯云服务器&#xff1a;CentOS 7.6 64bit。 学习集&#xff1a; C 入门到入土&#xff01;&#xff01;&#xff01;学习合集Linux 从命令到网络再到内核&#xff01;学习合集 目录索引&am…

配置Linux操作系统主机名及网络设置

上一篇我们讲到了如何克隆虚拟机&#xff0c;三台虚拟机Spark01、Spark02和Spark03默认为动态IP地址&#xff0c;若后续重启系统后IP地址便会发生改变&#xff0c;非常不利于实际开发&#xff0c;且虚拟机Spark02和Spark03是通过克隆虚拟机Spark01创建的&#xff0c;这会导致这…

软件测试银行项目到底“香”到哪里?

为什么做金融类软件测试&#xff1f; 做金融类软件测试的原因有以下几个&#xff1a; 保障客户资产安全&#xff1a;金融类软件通常涉及大量的客户财产和敏感信息&#xff0c;因此软件测试可以帮助发现潜在的漏洞和风险&#xff0c;从而确保客户的资产和信息得到充分的保护。 …

超详细IDEA:MavenWeb项目配置Tomcat

文章目录 附IDEA创建MavenWeb项目教程附Windows 10安装配置Tomcat教程一、插件配置Tomcat方式二、IDEA部署本地Tomcat方式 附IDEA创建MavenWeb项目教程 超详细IDEA创建MavenWeb项目教程 附Windows 10安装配置Tomcat教程 超详细Windows 10安装配置Tomcat教程 一、插件配置To…

LeetCode: 238. 除自身以外数组的乘积

目录 1. 解法一&#xff1a;时&#xff1a;O(N) &#xff0c;空&#xff1a;O(N) 2. 解法二&#xff1a;(解法一的空间优化) 时&#xff1a;O(N)&#xff0c;空&#xff1a;O(1) 3. 解法三 原题链接&#xff1a;238. 除自身以外数组的乘积 - 力扣&#xff08;Leetcode&#x…

java SSM 教务管理系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java SSM 教务管理系统是一套完善的web设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/…

网工内推 | 云方向招运维,云计算HCIE认证优先,最高22k

01 东华软件股份公司 招聘岗位&#xff1a;运维系统工程师&#xff08;云平台&#xff09; 职责描述&#xff1a; 1、 负责华为云平台Huawei CloudStack &#xff0c;FusionStorage分布式存储的维护&#xff0c;优化和故障处理&#xff1b; 2、 负责云平台上VDC、ECS、DDM、R…

1 Linux网络虚拟化

Linux网络虚拟化 文章目录 Linux网络虚拟化前言一、network namespace1.1 初识network namespace1.2 配置network namespace 二、veth pair三、容器与host veth pair的关系3.1 方法一3.2 方法二3.2 方法三 四、 Linux bridge4.1 Linux bridge初体验4.2 把IP让给Linux bridge4.3…

RestCloud-新一代(智能)全域数据集成平台

新一代智能全域数据集成平台 一、介绍1.1 企业级数据集成架构面临的痛点1.2 RestCloud说明1.3 重构企业数据融合架构&#xff0c;解决各种复杂、即时、高合规的数据集成需求1.4 (智能)全域数据集成平台1.5 300数据及应用连接器轻松汇聚全域数据 二、产品简介2.1 功能特性2.2 产…

Pytorch入门(五)使用ResNet-18网络训练常规状态下的CIFAR10数据集

本文采用ResNet-18PytorchCIFAR-10实现深度学习的训练。 文章目录 一、CIFAR-10 数据集介绍二、ResNet 神经网络的介绍1.ResNet 的网络模型2.本文用到的ResNet网络结构3.残差块的的解释4.ResNet神经网络的优缺点 三、ResNet-18 代码实现四、ResNet-18 训练 CIFAR-10数据集五、…

编写 OPC UA Compile的模型设计文件

OPC Foundation 开源了一个模型编译工具-UA ModelCompiler.它接受下面两种信息模型格式&#xff1a; NodeSet2.xmlModelDesign.xml 看来ModelDesign 是专门为UA ModelCompiler设计的&#xff0c;采用了分层结构描述&#xff0c;它比NodeSet2 可读性更好一点。适合使用普通文本…

【MySql】数据库的备份与恢复

文章目录 前言备份mysqldump还原source注意事项查看连接情况 前言 对与数据库的备份与恢复该怎么去做呢&#xff1f; Linux下对于文件或目录的备份&#xff0c;直接拷贝一份&#xff0c;留着备用&#xff0c;对于备份&#xff0c;比较简单的做法会就是直接打包拷贝一下&#x…

数据结构常用知识点整理(java版)(--修改中--)

目录 一、逻辑结构 1、栈 2、队列 顺序队列 循环队列 链式队列 &#xff08;相当于只能尾进头出的单链表&#xff09; 双端队列 (Deque) 3、数组 4、链表 5、树 二叉树 满二叉树 完全二叉树 二叉查找树&#xff1a; (ADT Tree) 红黑树&#xff1a; B树&#xf…

docker内无法通过域名访问外网问题解决方案一

一、问题描述 docker中有的时候需要从容器内向外网环境进行访问&#xff0c;这个时候我边出现了一个诡异的问题&#xff0c;从容器的宿主机直接通过curl命令使用域名可以正常的访问并返回正确的解决&#xff0c;但是从容器中向外调用外网环境的这个域名的时候&#xff0c;curl命…

ChatGPT 使用 拓展资料:吴恩达大咖 Building Systems with the ChatGPT API 内容审查

ChatGPT 使用 拓展资料:吴恩达大咖 Building Systems with the ChatGPT API 内容审查 https://learn.deeplearning.ai/chatgpt-building-system?_gl=114hjbho_gaMTEwNzkwNDAyMC4xNjgyNjUxMzg4_ga_PZF1GBS1R1*MTY4NTk2NTg1Ni4xNS4wLjE2ODU5NjU4NTYuNjAuMC4w 如果你正在建立一个…

糖酵解反应动力学方程的微分方程建模

糖酵解反应动力学方程的微分方程建模 题目 对于下面的糖酵解反应&#xff1a; 设其满足如下动力学方程&#xff1a; { d d t Glucose v 1 − v 2 d d t Gluc 6 P v 2 − v 3 d d t Fruc 6 P v 3 − v 4 v 5 d d t Fruc 1 , 6 P 2 v 4 − v 5 − v 6 d d t ATP −…

electron+vue3全家桶+vite项目搭建【19】集成微信登录

文章目录 引入实现思路实现步骤 引入 electron中实际就是嵌入了一个浏览器内核&#xff0c;所以在electron中集成微信登录实际和web端的集成方式是一样的。 demo项目地址 实现思路 这里参考这篇文章的 electron之微信扫码登陆&#xff08;不使用轮询&#xff09; 实现思路&a…