十大排序算法之冒泡排序、快速排序的介绍

news2024/12/24 22:01:08

个人主页:平行线也会相交
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创
收录于专栏【数据结构初阶(C实现)】
在这里插入图片描述

目录

  • 冒泡排序
    • 冒泡排序代码
    • 冒泡排序优化
  • 快速排序
    • 快速排序代码

冒泡排序

说起来冒泡排序,是我们接触到的最早的一个排序算法了,这次就当进行一个巩固提升了。冒泡排序还被称为交换排序
冒泡排序:

它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。走访元素的工作是重复地进行,直到没有相邻元素需要交换,也就是说该元素列已经排序完成。

下面是冒泡排序的动态图:

在这里插入图片描述
冒泡排序特点:

1.时间复杂度:O(N^2)
2.空间复杂度:O(1).
3.稳定性:稳定。

冒泡排序代码

void BubbleSort(int* a, int n)
{
	for (int j = 0; j < n - 1; j++)
	{
		for (int i = 1; i < n - j; i++)
		{
			if (a[i - 1] > a[i])
				Swap(&a[i - 1], &a[i]);
		}
	}
}

运行结果如下:
在这里插入图片描述

冒泡排序优化

我们知道冒泡排序的时间复杂度最坏情况是O(N^2),最好情况依然是O(N^2)。所以我们对其进行一个优化:

void BubbleSort(int* a, int n)
{
	for (int j = 0; j < n - 1; j++)
	{
		bool exchange = false;
		for (int i = 1; i < n - j; i++)
		{
			if (a[i - 1] > a[i])
			{
				Swap(&a[i - 1], &a[i]);
			}
			exchange = true;
		}
		if (exchange == false)
			break;
	}
}

如果我们冒泡完一趟以后,发现数组有序(即一次交换都没有发生),那么我们直接推出循环即可完成排序。
上面改进的冒泡排序最好的情况的时间复杂度是O(N)

在这里插入图片描述

快速排序

快速排序使用的是分治策略一个序列分为两个子序列。我们现在序列中选取一个元素作为基准值(或者称为关键值key),然后重新排序这个序列,如果是升序的话,所有比基准值大的元素放到基准值的右边,所有比基准值大的元素放在基准值的左边,经过此分区结束之后,然后对左右子序列重复此过程,直到所有元素出现在相对应的位置上。
其实简单来说就是选出一个基准值(一般选最左边或者最右边的),把这个基准值放到它所对应的位置上去。

下面是快速排序的动态图:
在这里插入图片描述
上图就是选取最左边的5作为基准值,然后比5大的元素放到5的右边,比5小的元素放到5的左边。最终5就会出现在其所对应的位置上。
举个例子:
现在我们来对数组{6,1,2,7,9,3,4,5,10,8}来进行排序。请看图解:

在这里插入图片描述
经过一次单趟排序后,上图中的6已经处于其对应的位置了,所以对于快速排序的单趟排序中,本质也是把一个元素排好
在这里插入图片描述

快速排序代码

QuickSort(int* a, int left, int right)
{
	if (left >= right)
		return;
	int begin = left, end = right;

	int keyi = left;
	while (left < right)
	{
		//右边找小
		while (left < right && a[right] >= a[keyi])
		{
			right--;
		}

		//左边找大
		while (left < right && a[left] <= a[keyi])
		{
			left++;
		}
		Swap(&a[left], &a[right]);
	}
	Swap(&a[left], &a[keyi]);
	keyi = left;

	//接下来进行递归
	//[begin , keyi - 1]  keyi  [keyi + 1 , end]   
	QuickSort(a, begin, keyi - 1);
	QuickSort(a, keyi + 1, end);
}

运行结果如下:
在这里插入图片描述

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

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

相关文章

推荐8款在win11上还能用的“古董级”软件

前几天花重金1.3个w买了一台新电脑华为一体机MateStation X 2023&#xff0c;用了近10年的华硕迷你电脑终于要下岗了。这么多年来一直在用win7操作系统&#xff0c;现在直接迭代到win11了&#xff0c;以前几个用得称手的工具软件不舍得扔&#xff0c;拷到新电脑上居然还能用&am…

前端之CSS常用选择器分享~

目录 1. 标签选择器 2. 类选择器 3. id选择器 4. 后代选择器 5. 子代选择器 6. 并集选择器 7. 兄弟选择器 1. 标签选择器 ● 基本格式 : 标签名{属性1: ; 属性2: ; 属性3: ;....} ● 示例代码 <body><style>div {width: 100px;height: 100px;background-co…

【微报告】行泊一体低、中、高算力平台,谁能率先突围?

行泊一体是大势所趋&#xff0c;且正分层发展&#xff0c;这是业内已有的共识。但对身处其中的竞争者&#xff0c;更重要且更难的显然为踏准市场节奏&#xff0c;从而用既有的资源取舍布局&#xff0c;最终吃下窗口期爆发红利&#xff0c;在细分赛道中脱颖而出。 高工智能汽车…

[Hadoop]数据仓库基础与Apache Hive入门

目录 大数据导论与Linux基础 Apache Hadoop、HDFS 大数据导论与Linux基础 数据仓库基本概念 数据仓库概念 数据仓库主要特征 数据仓库主流开发语言--SQL Apache Hive入门 Apache Hive概述 场景设计&#xff1a;如何模拟实现Hive功能 Apache Hive架构、组件 Apache H…

Python实现ACO蚁群优化算法优化卷积神经网络分类模型(CNN分类算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 蚁群优化算法(Ant Colony Optimization, ACO)是一种源于大自然生物世界的新的仿生进化算法&#xff0c…

深入理解 go sync.Waitgroup

本文基于 Go 1.19。 go 里面的 WaitGroup 是非常常见的一种并发控制方式&#xff0c;它可以让我们的代码等待一组 goroutine 的结束。 比如在主协程中等待几个子协程去做一些耗时的操作&#xff0c;如发起几个 HTTP 请求&#xff0c;然后等待它们的结果。 WaitGroup 示例 下面…

CH32V3xx USART 空闲中断+DMA接收

目录 1、CH32V3xx USART简介2、测试程序2.1 USART 初始化配置2.1 发送函数2.1 接收中断1、CH32V3xx USART简介 CH32V3xx系列MCU包含3个同步异步收发器(USART1、2、3)和5个通用异步收发器(UART4、5、6、7、8)。USART模块支持DMA功能,DMA可以实现快速连续收发。使用DMA发送时…

windows安装pcl

文章目录 vcpkg方式安装默认安装x86默认没安装cloud_viewer.h AllInOne安装pcl的官方例程 vcpkg方式安装 官方建议在windows下&#xff0c;采用vcpkg的方式来安装&#xff1a; 安装vcpkg的&#xff0c;可以看这里&#xff1a;【WIN安装vcpkg】 默认安装x86 要注意的是 vcpkg…

品牌线上推广:如何进行电商控价?

随着电商平台的迅速崛起&#xff0c;电商控价已经成为了一个十分重要的话题。所谓电商控价&#xff0c;是指在电子商务平台上&#xff0c;品牌方针对自己的产品进行价格的控制&#xff0c;以确保产品的售价不被平台和第三方商家恶意砍价而影响品牌形象和盈利。那么&#xff0c;…

iptables 防火墙(二)SNAT/DNAT

目录 一&#xff1a;SNAT原理与应用 1.SNAT介绍 2.SNAT 应用环境 3.SNAT原理 二&#xff1a;SNAT配置 第一步&#xff1a;设置各个端口的网卡 1.先准备客户机、web服务器、网关服务器 2.网关服务器设置 &#xff08;1&#xff09;添加网卡 &#xff08;2&#xff09;修…

10分钟!Python写一个角色扮演带上下文功能的chatgpt聊天机器人!上篇!

大家都在网页上玩ChatGPT玩的不亦乐乎&#xff0c;但是很多时候我们需要打造个人专属的GPT&#xff0c;比如我是律师&#xff0c;我是医生&#xff0c;我是营养师&#xff0c;我是财会&#xff0c;我是猎头&#xff0c;我需要专属的某个领域的GPT&#xff0c;其实也不难。 今天…

加密解密软件VMProtect教程(八)许可制度之管理许可证

VMProtect是新一代软件保护实用程序。VMProtect支持德尔菲、Borland C Builder、Visual C/C、Visual Basic&#xff08;本机&#xff09;、Virtual Pascal和XCode编译器。 同时&#xff0c;VMProtect有一个内置的反汇编程序&#xff0c;可以与Windows和Mac OS X可执行文件一起…

加密解密软件VMProtect入门使用教程(八)许可制度之许可系统功能

VMProtect是新一代软件保护实用程序。VMProtect支持德尔菲、Borland C Builder、Visual C/C、Visual Basic&#xff08;本机&#xff09;、Virtual Pascal和XCode编译器。 同时&#xff0c;VMProtect有一个内置的反汇编程序&#xff0c;可以与Windows和Mac OS X可执行文件一起…

‘Light轻食初试版’小程序制作到发布过程中遇到的问题

目录 前言技术栈开发经验布局字体问题图片问题协作开发 发布时遇到的问题接口问题分包、图片显示问题小程序与公众号关于测试版本 总结 前言 学完小程序方面的知识后&#xff0c;我花四天时间做了一个简单的微信小程序——轻食Light说。这个小程序目前叫作“Light轻食说初始版…

【R模型】R语言线性回归之简单线性回归模型 (一)

&#x1f482; 个人信息&#xff1a;酷在前行&#x1f44d; 版权: 博文由【酷在前行】原创、需要转载请联系博主&#x1f440; 如果博文对您有帮助&#xff0c;欢迎点赞、关注、收藏 订阅专栏&#x1f516; 本文收录于【R模型】&#xff0c;该专栏主要介绍R语言各类型机器学习…

ORA-01555-快照过旧问题处理

背景 通过监控发现ETL报错 如何处理 ORA-01555 是 Oracle 数据库的一个错误代码&#xff0c;表示出现了“快照太旧”的错误。这个错误通常是由于数据库中的回滚段不够大&#xff0c;导致无法满足当前事务的需&#xff0c;从而导致事务回滚失败。 具体来说&#xff0c;ORA-0…

如何知道调用电商API是否成功返回数据?查看错误码解释

在API调用过程中&#xff0c;系统可能会返回一些错误码。错误码能够帮助开发者快速准确地了解出现的异常情况。错误码的含义通常涉及到请求参数不合法、认证失败、服务器内部错误等各种问题&#xff0c;它们提供了有关API调用失败的信息和上下文&#xff0c;在错误排查和修复时…

【案例教程】环境影响与碳排放生命周期评估应用及案例分析实践技术

生命周期分析是一种分析工具&#xff0c;它可帮助人们进行有关如何改变产品或如何设计替代产品方面的环境决策&#xff0c;即由更清洁的工艺制造更清洁的产品。例如&#xff0c;生命周期分析的结果表明&#xff0c;某种产品能耗低&#xff0c;寿命长&#xff0c;不含有毒化学物…

Java实现识别发票信息

Java实现调用第三方接口识别发票信息 需求&#xff1a;对每个发票图片文件进行重命名&#xff0c;名称为发票号固定信息&#xff0c;主要处理增值税发票 这里需要用到第三方接口&#xff0c;OCR识别功能&#xff0c;这里我用的是百度云接口&#xff0c;所以你需要注册百度云账…

计算机网络:计网体系结构

计网体系结构 1. 基本概念1.0 计算机网络的发展1.0.1 第一阶段1.0.2 第二阶段1.0.3 第三阶段 1.1 计算机网络的概念1.2 计算机网络的功能1.3 计算机网络的组成1.4 计算机网络的分类1.5 标准化工作及相关组织1.6 相关性能指标1.6.1 速率1.6.2 带宽1.6.3 吞吐量1.6.4 时延1.6.5 时…