[ 数据结构 -- 手撕排序算法第六篇 ] 快速排序(非递归版本)

news2024/11/24 9:24:12

文章目录

  • 前言
  • 一、常见的排序算法
  • 二、快速排序的非递归版本
  • 三、具体步骤
  • 四、非递归的代码实现
  • 五、时间复杂度
    • 4.1最好情况
    • 4.2最坏情况
  • 六、总结


前言

手撕排序算法第六篇:快速排序!
从本篇文章开始,我会介绍并分析常见的几种排序,例如像插入排序,冒泡排序,希尔排序,选择排序,快速排序,堆排序,归并排序等等!
这篇文章我先来给大家手撕一下快速排序

大家可以点下面的链接去阅读其他的排序算法:
C语言手撕排序算法


正文开始!

一、常见的排序算法

在这里插入图片描述

二、快速排序的非递归版本

上节课我们写了快速排序的递归版本的三种实现,**递归也有不好的地方,递归最大的缺陷是如果排序调用的栈帧太深,可能会导致栈溢出。**因为栈的大小一般只有8M。

快排的非递归是实现其实是利用了栈的特性,因为栈的特点是先进后出。那么非递归版本是如何实现的呢?其实还是利用栈实现了递归的思想。

在上篇文章的递归实现,主要是将大区间划分为多个小区间,然后再对每个小区间进行排序,直到每个小区间都有序并且无法在划分的时候,就完成排序。

非递归的思想和递归差不多,接下来带大家看看非递归版本。

三、具体步骤

  1. 我们先将所给的区间进行入栈,然后取出栈顶元素赋给right(先进后出,所以先取出来的是右下标),然后再删除堆顶的元素。再取出栈顶元素赋给left,然后再删除栈顶元素。对取出来的的区间范围进行单趟排序.
  2. 排序完成返回一个keyi的值,这个值又把数组分成三个区间[0,keyi-1],keyi,[keyi+1,right].
  3. 我们再对小区间重复1操作,直到小区间无法被划分,证明排序完成。

让我们画图再简单理解一下:
在这里插入图片描述

四、非递归的代码实现

//前后指针法
int PartSort3(int* a, int left, int right)
{
	//int midi = GetMidIndex(a,left,right);
	//Swap(&a[midi],&a[left]);
	int key = a[left];
	int prev = left;
	int cur = prev + 1;
	while (cur<=right)
	{
		if (a[cur] < key&&a[++prev]!=a[cur])//遇到比ket小的值先++prev,接下来防止自己和自己交换
			Swap(&a[prev], &a[cur]);
		cur++;
	}
	Swap(&a[left],&a[prev]);
	return prev;
}
//快排的非递归实现
void QuickSortNonR(int* a, int begin, int end)
{
	ST st;
	StackInit(&st);
	StackPush(&st, begin);
	StackPush(&st,end);
	while (!StackEmpty(&st))
	{
		//因为栈的特性是先进后出,所以要先取出右,再取出左
		int right = StackTop(&st);
		StackPop(&st);
		int left = StackTop(&st);
		StackPop(&st);
		
		//进行单趟排序
		int keyi = PartSort3(a,left,right);

		//再将分割起来的区间入栈,方便我们下次循环继续取出数据
		//[left,keyi-1]keyi[keyi+1,right]
		if (left<keyi - 1)
		{
			StackPush(&st, left);
			StackPush(&st, keyi - 1);
		}
		if (keyi + 1 < right)
		{
			StackPush(&st, keyi + 1);
			StackPush(&st, right);
		}
	}
	StackDestory(&st);
}
void TestQuickSort()
{
	int a[] = { 6,1,2,7,9,3,4,5,10,8 };
	printf("排序前:");
	PrintArray(a, sizeof(a) / sizeof(a[0]));
	QuickSortNonR(a, 0,sizeof(a) / sizeof(a[0])-1);
	printf("排序后:");
	PrintArray(a, sizeof(a) / sizeof(a[0]));
}
int main()
{
	TestQuickSort();
	return 0;
}

在这里插入图片描述

在这里我们发现要实现快速排序的非递归版本,首先要先实现一个栈结构
在这里给出栈的代码,大家可以直接去使用。

五、时间复杂度

非递归时间复杂度依旧和递归一样,具体分析情况请参考上篇[ 数据结构 – 手撕排序算法第六篇 ] 快速排序

4.1最好情况

O(N*logN)

4.2最坏情况

O(N^2)

六、总结

对于快速排序我们到这里递归版本和非递归版本的实现就结束了。对于快速排序的递归的三个版本还是要加强理解,还有后面的优化部分,小区间使用直接插入排序完成和三数取中的优化,需要着重理解一下。


(本章完!)

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

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

相关文章

143744-88-1,标记肽Dansyl-GCVLS

法尼基二磷酸法尼基转移酶(FTase)的荧光底物。该五肽基于H-Ras的c端区域&#xff0c;其n端有一个丹酚基团。由于半胱氨酸巯基的法尼化作用&#xff0c;丹酚基从极性分子环境变为非极性分子环境&#xff0c;伴随而来的是荧光增强和丹酚基向较低波长发射最大值的转移。该产物的完…

【设计模式】代理模式 (六)

文章目录5.1 代理模式5.1.1 概述5.1.2 结构5.1.3 静态代理5.1.4 JDK动态代理5.1.5 CGLIB动态代理5.1.6 三种代理的对比5.1.7 优缺点5.1.8 使用场景5.1 代理模式 5.1.1 概述 由于某些原因需要给某对象提供一个代理以控制对该对象的访问。这时&#xff0c;访问对象不适合或者不…

程序员现状分析,什么时候是进入IT行业的黄金时期?千万注意了

近些来&#xff0c;程序员成为了很多人就业的首选。但是大多数人对于程序员的了解仅仅停留在了薪资待遇上&#xff0c;但是他们对于程序员的工作却所知甚少。甚至有不少人只听说了程序员的工资很高&#xff0c;并不知道程序员的工资会高到什么地步。 其实近些年来&#xff0c;随…

Mysql窗口函数 (知识点梳理+题目解析+面试实战)(四万字长文,一文读懂,建议收藏后食用)

前言&#xff1a; 本文章是原创50篇时开启的纪念作&#xff0c;之前的文章基本5000字&#xff0c;而本篇约4.5万字&#xff0c;真一篇顶九篇。 窗口函数作为Mysql 8的新特性以及面试笔试的重点&#xff0c;掌握并且进行来练习是非常有必要的。本文章详细介绍窗口函数的方…

uni-app app分享到朋友和朋友圈

app分享到朋友和朋友圈 uni.share(OBJECT) uni-app的App引擎封装了微信、QQ、微博的分享SDK&#xff0c;开发者可以直接调用相关功能 可以分享到微信、QQ、微博&#xff0c;每个社交平台被称为分享服务提供商&#xff0c;即provider。 可以分享文字、图片、图文、音乐、视频…

热门技术中的应用:微服务相关协议-第32讲-RPC协议综述:远在天边,近在眼前

前面我们讲了容器网络如何实现跨主机互通,以及微服务之间的相互调用。 网络是打通了,那服务之间的互相调用,该怎么实现呢?你可能说,咱不是学过Socket吗。服务之间分调用方和被调用方,我们就建立一个TCP或者UDP的连接,不就可以通信了? 你仔细想一下,这事儿没这么简单。…

[附源码]计算机毕业设计Python高校商铺管理系统论文(程序+源码+LW文档)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

微服务框架 SpringCloud微服务架构 微服务面试篇 54 微服务篇 54.3 Nacos 如何支撑数十万服务注册压力?

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 微服务面试篇 文章目录微服务框架微服务面试篇54 微服务篇54.3 Nacos 如何支撑数十万服务注册压力&#xff1f;54.3.1 Nacos 服务端源码54 微…

信息提取 Information Extraction

定义 信息提取任务是从一组非结构化自然语言文本中的每个文本中识别有关实体、关系或事件的预定义类的信息&#xff0c;并通过以下任一方式以结构化形式记录此信息&#xff1a; • 注释源文本&#xff0c;使用 XML 标签 • 填写与文本分开的数据结构&#xff0c;例如模板或数据…

centos8 nginx 开启 ssl(https)

centos8 nginx 开启 ssl&#xff08;https&#xff09;首先申请证书&#xff0c;以阿里云为例centos8 nginx 安装 sslnginx 配置文件遇到问题一直没有给域名开启 https&#xff0c;在 Cesium 沙盒模拟中使用 http 资源会提示错误&#xff0c;于是想着把 https 打开&#xff0c;…

【计算机毕业设计】基于HTML+CSS+JavaScript大学生心理咨询网设计毕业论文源码

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

53.Python的f格式化字符串

53.f格式化字符串 文章目录53.f格式化字符串1.知识回顾2.f格式化字符串3.课堂练习4. 字符串格式化总结1.知识回顾 之前我们学了2种格式化方法&#xff1a; %占位符格式化 .format字符串格式化 【目标任务】 原样输出&#xff1a;大家好&#xff0c;我叫XXX&#xff0c;来自X…

2022卡塔尔世界杯 | 致我们每个人那份绿茵场上的足球梦

一个沾满草腥味的皮球&#xff0c;在经过一系列有名气的或者没名气的金脚触碰之后&#xff0c;缓慢地或者迅速地躲过后卫和门将大义凛然的身体&#xff0c;越过了那个由门柱和横梁构成的透明长方体平面…… 如果你不是球迷&#xff0c;你真的很难理解这么一个皮革制品的物理位移…

全网最详细的网络安全入门教程,一篇文章满足你

随着当下正在发生的互联网革命&#xff0c;以及乌俄局势的网络战&#xff0c;网络安全行业已经受到更多人的关注&#xff0c;而这个行业的人才缺口将继续呈指数型扩张。借用行业内某大咖的一句话“网络安全行业的人才成材率极低”&#xff0c;究其原因还是因为网络安全从业者所…

MD编辑器使用方法

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注…

如何解决 科班和自学编程出身差别,差距又在哪里?

自学和科班的差别最大的在于学习的人本身——不在呼是否科班。 自学编程和计算机科班出身的差别在哪&#xff1f; 不同的人持有不同的看法其实相辅相成才能发挥最大作用 A先生&#xff1a;听从父母的意见选择了编程专业&#xff0c;学习天天逃课&#xff0c;毕业后父母帮忙找…

十一、Docker 中redis集群扩容、缩容

接上篇redis集群3主3从搭建,如果您没看过,建议先看下:https://blog.csdn.net/u011837804/article/details/128321703 适逢双十一等大型活动流量爆增时redis集群扛不住了,这个时候怎么办呢,不能说把redis停了,我再搭建一个5主5从集群吧,这个时候就需要用到redis自动扩容…

Java反射机制与枚举类

目录 1.反射 1.1反射的定义与用途 1.2反射相关的类及方法 1.2.1(重要)获得类相关的方法 1.2.2(重要)获得类中属性相关的方法 1.2.3(重要)类中构造器相关的方法 1.2.4(重要)获得类中方法相关的方法 1.2.5获得类中注解相关的方法 1.3反射示例 1.3.1获取Class对象的三种…

实时采集MySQL数据之轻量工具Maxwell实操

文章目录概述定义原理Binlog说明Maxwell和Canal的区别部署安装MySQL准备初始化Maxwell元数据库Maxwell进程启动命令行参数配置文件实时监控Mysql输出KafkaKafka Topic分区控制实时监控MySQL指定表监控MySQL指定表同步全量数据概述 定义 Maxwell 官网地址 https://maxwells-dae…

3D相机获取点云信息的几种方法

在计算机中, 图像由一个个像素点组成。图像数据存储在每一个像素点中&#xff0c;每一个像素点包含了被测物体的信息。除了常见的RGB信息或者灰度信息以外&#xff0c;还可以包含深度信息和坐标等其它信息。在某个坐标系下的点的数据集又被称为点云。点云里的每一个点包含了丰富…