常用排序算法笔记之冒泡排序、快速排序

冒泡排序和快速排序算法 序言: 一 冒泡排序算法 二 冒泡排序程序实现 三 快速排序算法 四 快速排序算法程序实现 第一冒泡排序算法 简介 冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。 它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果他们的顺序(如从大到小、首字母从A到Z)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列... 阅读详情

写个笔记。

冒泡算法不多说,很简单,基本思路就是不断的把最大的数送往最大数该有的位置,然后把第二大数送往第二大应有的位置。简单粗糙的实现代码:

void SortArray(int* _pArray, int _nArraySize)
{
	for(int i = 0; i < _nArraySize - 1; ++i)
	{
		for(int j = 0; j < _nArraySize - 1 - i; ++j)
		{
			if(_pArray[j] > _pArray[j+1])
			{
				int nSwap = _pArray[j];
				_pArray[j] = _pArray[j+1];
				_pArray[j+1] = nSwap;
			}
		}
	}
}


快速排序稍微有点复杂。理论上是一种分而治之的思维,而具体表现则是分多次循环,每一个循环,将待排序数组排序为 (比基准数小的数) 基准数 (比基准数大的数)。所以每次排序的核心算法就是把数组分割成2部分。

这个分割算法以前也没多研究过,前几天看了别人的文章,大概自己理解了下。基本思路就是创建两个索引,分别为头索引及尾索引,分别是数组头及尾的索引。基本思路如下:

1.首先选择基准数,现在选择头索引锁指向的值,并记录下基准数的索引值。

2.尾索引开始向头索引移动,分别判断索引指向的值,假设该值小于基准数,则尾索引扫描停止。假设尾索引到了头索引的位置,则停止扫描,将基准数与尾索引指向的值进行交换,记录下基准数现在所在的索引,此轮分割结束,直接跳向下轮分割(步骤5)

3.头索引向尾索引移动,分别判断头索引指向的值,假设该值大于基准数,则头索引扫描停止。假设头索引到了尾索引的位置,则停止扫描,将基准数与头索引指向的值进行交换,记录下基准数现在所在的索引,此轮分割结束,直接跳向下轮分割(步骤5)

4.在头索引及尾索引没有碰撞的情况下,则交换两个索引指向的值,跳向步骤2继续开始分割。

5.分割结束。则将基准数现在的索引旁边的2个字数组就行分割。

6.排序完成


步骤是有点多,核心内容就是尾索引向头索引移动,找到比基准数小的数,头索引相似。分割的结束点在两索引碰撞的时候,这时候分割就结束了,我们只要交换基准数和碰撞点的数就可以了。分割完成后基准数左边的数值都小于基准数,右边的数都大于基准数。


自己写了个简陋的算法,算是实现了自己理解的思路:

void QuickSort(int* _pArray, int _nHead, int _nTail)
{
	if(_nHead >= _nTail)
	{
		//	nothing
		return;
	}

	//	find the base number
	int nBaseNumber = _pArray[_nHead];
	int nBaseNumberPosition = _nHead;
	int nCheckHeadIndex = _nHead;
	int nCheckTailIndex = _nTail;
	bool bLoopBreak = false;

	for(;;)
	{
		for(; nCheckTailIndex >= nCheckHeadIndex; --nCheckTailIndex)
		{
			if(nCheckTailIndex == nCheckHeadIndex)
			{
				std::swap(_pArray[nCheckTailIndex], _pArray[nBaseNumberPosition]);
				nBaseNumberPosition = nCheckTailIndex;
				bLoopBreak = true;
				break;
			}

			if(_pArray[nCheckTailIndex] < nBaseNumber)
			{
				break;
			}
		}

		if(bLoopBreak){break;}

		for(; nCheckHeadIndex <= nCheckTailIndex; ++nCheckHeadIndex)
		{
			if(nCheckHeadIndex == nCheckTailIndex)
			{
				std::swap(_pArray[nCheckHeadIndex], _pArray[nBaseNumberPosition]);
				nBaseNumberPosition = nCheckHeadIndex;
				bLoopBreak = true;
				break;
			}

			if(_pArray[nCheckHeadIndex] > nBaseNumber)
			{
				break;
			}
		}

		if(bLoopBreak){break;}

		std::swap(_pArray[nCheckHeadIndex], _pArray[nCheckTailIndex]);
	}

	// sort the left 2 parts
	if(nBaseNumberPosition > _nHead + 1)
	{
		QuickSort(_pArray, _nHead, nBaseNumberPosition - 1);
	}
	if(nBaseNumberPosition < _nTail - 1)
	{
		QuickSort(_pArray, nBaseNumberPosition + 1, _nTail);
	}
}


排序算法解析——冒泡排序、选择排序、快速排序 时间复杂度是度量算法执行的时间长短,而空间复杂度是度量算法所需存储空间的大小。 算法的时间复杂度记做:T(n)=O(f(n))     在计算时间复杂度的时候,先找出算法的基本操作,然后根据相应的各语句确定它的执行次数,再找出T(n)的同数量级(它的同数量级有以下:1、Log2n、n、nLog2n、n的平方、n的三次方、2的n次方、n!),找出后,f(n)=该数量级,如冒泡排序的时间复 阅读详情

相关推荐

十大排序算法详解(一)冒泡排序、选择排序、插入排序、快速排序、希尔排序

冒泡排序、选择排序、插入排序、快速排序、希尔排序

pythoncjave的博客 1839

C++实现交换排序算法(冒泡排序、快速排序)

排序算法分为五大类,一共是有九种,如下: 插入类:直接插入排序、折半插入排序、希尔排序 交换类:冒泡排序、快速排序 选择类:简单选择排序、堆排序 归并类:二路归并排序 基数类:多关键字排序 九种算法的时间复杂度、空间复杂度和稳定性小结如下: 本文放出选择算法的两种排序算法代码。 冒泡排序 void BubbleSort(int R[], int n) { int i, j, temp, flag; cout << endl << "冒泡排序:" << endl;

qq_38222051的博客 3703

[排序算法]:Java实现冒泡排序和快速排序

冒泡排序 冒泡排序原理:        整个过程像气泡一样往上升,单向冒泡排序的基本思想是(假设由小到大排序):对于给定n个记录,从第一个记录开始依次对相邻的两个记录进行比较,当前面的记录大于后面的记录时,交换位置,进行一轮比较和换位后,n个记录的最大记录将位于第n位,然后对前(n-1)个记录进行第二轮比较;重复该过程,直到记录剩下一个为止。 这段时间看了许多经典排序算法,冒泡排

我只是个程序员。 1047

排序算法中——冒泡排序和快速排序

上篇介绍了排序算法中的插入,选择,希尔和堆排序,本篇讲主要讲解冒泡排序和快速排序。

2303_81060385的博客 5890

【排序】交换类排序—冒泡排序、快速排序手撕图解

交换类排序——冒泡排序、快速排序详解。无论是日后面试还是笔试的,排序在数据结构与算法中有着举足轻重的地位,所以还是决定把数据结构这个专题好好写写,多研究研究!今天和大家一起学习**交换类排序**——冒泡和快排详解! 在排序中,**冒泡和快排是考察最多**的了,当然在实行上面`冒泡要相比快排简单很多`。理解起来也算得上是最简单的排序算法,而快排的话很多面试笔试都是**要求手撕**的,所以重要性不言而喻!

bigsai 8605

QML 地图修改插件源码(三),Map在Plugin中设置加载地图类型

常用的地图种类分为交通图,地形图,卫星图等等,在QML的Map(以OSM地图为例)中提供activeMapType属性用于读取当前显示的地图类型(注意:该属性为只读属性,不能用于赋值),QML中地图的加载寻找根据瓦片的文件名进行查找,例如名为"osm_100-l-5-2-2-3.png"的瓦片,其中5代表了该地图的类型

zjgo007的专栏 3164

【排序算法】快速排序、冒泡排序

情况时间复杂度空间复杂度最好情况O(n log n)O(log n)最坏情况O(n^2)O(n)平均情况O(n log n)O(log n)时间复杂度:快速排序的平均和最好情况时间复杂度为O(n log n),但在最坏情况下可能会退化为O(n^2)。空间复杂度:快速排序是原地排序算法,额外的空间复杂度为O(1),但递归栈的空间消耗取决于递归深度,平均为O(log n),最坏情况下为O(n)。通过合理的基准值选择(如三数取中法)和优化手段,快速排序在实践中通常表现出非常高效的。

2301_76677973的博客 2878

VSCode上搭建C/C++开发环境(vscode配置c/c++环境)Windows系统---保姆级教程

关于VSCode上搭建C/C++开发环境的内容,到这里就结束了,这里博主感叹一下,VSCode真的挺强大的,作为一个编辑器,可以通过和编译器链接成为开发环境,将环境配置好的话,在这上面写代码似乎也是个不错的选择。大家有任何疑问,欢迎在评论区中提出,本篇博客有任何问题和错误也欢迎来和博主讨论,真心希望能和大家一起进步。最后,如果本篇博客对你有帮助的话,能不能给博主一个三连啊!

2303_79329831的博客 8万+

[排序算法]冒泡排序+快速排序全梳理!

冒泡排序和快速排序

f_2789889770的博客 1734

用OpenNI2获取奥比中光Astra Pro及 Astra Pro SM输出的深度图(win,linux arm64 x64平台)

搞了一个奥比中光Astra Pro,想在windows平台,和linux rk3588 上获取深度信息,之前的驱动下载已经不好用了。

babytiger的专栏 1305

华为P812E光猫补全shell配置PON口模式

终于看到华为企业级的带2.5电口P812E横空出世了,相信很多发烧友也已经将此收入昂中。相信体验的同时,遇到的第一件事情就是配置PON口模式的问题,本文将带发烧基友解锁模式。

GUAIYU的博客 5727

常见排序算法之交换排序——冒泡排序、快速排序

​ 哈喽大家好,我是保护小周ღ,本期为大家带来的是常见排序算法中的交换排序,主要有冒泡排序,快速排序,快排分享了三种算法:挖坑法,左右指针法,前后指针法,以及两种优化方式:解决快排最坏情况的“三数取中”,避免递归次数过多的"小区间优化",包您一看就会,快来试试吧~ ​......

保护小周ღ的博客 3984

万字详解YOLOv8网络结构Backbone/neck/head以及Conv、Bottleneck、C2f、SPPF、Detect等模块

YOLOv8是由Ultralytics开发的最先进的目标检测模型,推升了速度、准确性和用户友好性的界限。YOLO这一缩写代表“你只看一次”(You Only Look Once),通过在一次网络传递中同时预测所有边界框,提升了算法的效率和实时处理能力。相比之下,其他一些目标检测技术需要经过多个阶段或过程来完成检测。YOLOv8在流行的YOLOv5架构上进行了扩展,在多个方面提供了改进。

专注于图像领域,主要研究内容包括计算机视觉和深度学习,特别是在图像分类、目标检测和图像生成等方面有深入的研究和实践经验。 14万+

排序算法总结——冒泡排序和快速排序

提到排序算法,大家首先想到的肯定是冒泡和快排了,因为冒泡排序最简单,快速排序速度最快。今天就来介绍一下这两个排序算法。 冒泡排序 首先来看冒泡排序,其基本思想是一组数据,两两两个对其进行比较,将大的数据元素置于右边,小的数据元素置于左边,这样最大的元素将会置于最右边,接着重复进行之前的操作,以此类推,直至最左边的元素都有序,此时所有数据元素都变得有序。如下图: 代码如下: void Bubble...

love10_1314的博客 1161

ROSTEA软件下载及情感分析详细操作教程(附网盘链接)

原ROST虚拟团队出品的ROST系列文本内容挖掘分析平台,是辅助人文社会科学研究的免费计算平台。该软件可以实现文本预处理、分字、分词、词性识别、特殊名词抽取、词频统计、英文词频统计、情感计算、分类算法、聚类算法等一系列文本挖掘,是人文社科研究和论文写作的一把利器。该软件用户量超过一万人,遍布海内外100多所大学,包括剑桥大学、日本北海道大学、北京大学、清华大学、香港城市大学、澳门大学等众多高校。关于ROSTCM6的安装介绍可以参考之前的文章ROSTCM6软件下载及语义网络分析详细操作教程ROST EA。

m0_64336780的博客 1万+

Claude Code(8):使用 skill-creator 打造属于测试人员的 Skills

本文介绍了如何使用Claude Code的skill-creator工具快速创建测试相关的Skills。skill-creator是一个专门用于创建新Skills的Skill,相比手动创建更高效。文章详细演示了安装skill-creator的步骤,并通过创建"测试计划编写助手"的实战案例,展示了如何通过对话方式定义Skill名称、触发条件和功能需求。skill-creator会自动生成完整的SKILL.md文件和目录结构,用户只需确认即可完成Skill创建。

blues_C的博客 525

漫谈经典排序算法:三、冒泡排序 && 快速排序

1、序言 这是《漫谈经典排序算法系列》第三篇,先解析了冒泡排序,然后引出快速排序,给出了快速排序的两种实现版本。 各种排序算法的解析请参考如下: 《漫谈经典排序算法:一、从简单选择排序到堆排序的深度解析》 《漫谈经典排序算法:二、各种插入排序解析及性能比较》 《漫

Touch_2011的专栏 2万+

2026最新版OpenClaw安装:Windows WSL2从零到跑通

Windows WSL2安装OpenClaw指南 本文详细介绍了在Windows系统上通过WSL2部署OpenClaw AI助理的完整流程。WSL2结合了Windows易用性和Linux高性能,特别适合Windows用户、开发者、学生和技术爱好者。文章涵盖硬件要求(推荐i5/16GB/SSD)、系统准备(Windows 10/11+WSL2)、环境部署(Python/Node.js/Redis)和OpenClaw配置(克隆/编译/初始化)等关键步骤。通过WSL2,用户可在保留Windows操作习惯的同

一键难忘的博客 2345

排序算法——快速排序+冒泡排序

排序是数据处理的基础操作,通过降低时间复杂度提升查找和分析效率。本文介绍了两种经典排序算法:冒泡排序通过相邻元素比较交换实现,时间复杂度O(n²),适合小规模数据;快速排序采用分治法,平均时间复杂度O(nlogn),适合大规模数据。比较显示,冒泡排序简单稳定但效率低,快速排序高效但不稳定。实际应用中需根据数据规模和需求选择算法,小数据可选冒泡排序,大数据优先考虑快速排序,后者因其高效性成为实践中最常用的排序算法之一。

qq_74918626的博客 1420

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

排序算法(三) 冒泡排序和快速排序

排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;否则称为不稳定的。内部排序:数据元素全部放在内存中的排序。外部排序:数据元素太多不能同时放在内存中,根据排序过程的要求不能在内外存之间移动数据的排序。

m0_73633144的博客 2158

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

几种常用的排序算法(冒泡排序,快速排序,选择排序)

在如今大数据时代,数据处理显得尤为重要。今天在这里给大家介绍两种常见的排序算法:冒泡排序、快速排序。 (1)冒泡排序 基本思路:如果要对n个数进行冒泡排序,一一比较,则需要比较n-1次,在第一次比较中需要两两比较n-1次,在第j此比较中要两两比较n-j次;所以,只需两个for循环即可实现此算法。 代码如下: 在这里插入代码片 ...

顾南怀 1697

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

十大排序算法——快速排序,冒泡排序

1.冒泡排序 2.快速排序 1.冒泡排序(Bubble Sort)是一种简单直观的排序方法,它需要过要排序的数列,一次比较两个元素,直至走访到序列全部正确,即排序完成。 算法步骤简单的说就是始终将较大的数放在右边。 python代码实现: def bubbleSort(arr): for i in range(1, len(arr)): for j in range(0...

weixin_43443474的博客 1760

php快速排序和冒泡排序

快速排序:这是一种高效的排序算法,采用分治策略来把一个序列分为较小和较大的两个子序列,然后递归地排序两个子序列。冒泡排序:这是一种简单的排序算法,它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。接下来的部分将详细介绍这两种排序算法以及如何使用PHP来实现它们。通过以上内容的学习,您应该能够理解并能够在实际项目中应用快速排序和冒泡排序这两种基础的排序算法。

chatgpt001的博客 1093

排序算法:冒泡排序和快速排序

排序算法基本上是程序员必要掌握的一种技能;针对不同的数据特点采用不同的算法将会提高程序的效率,大大的节省资源。排序算法有很多种如插入排序、选择排序、冒泡排序、快速排序、归并排序、希尔排序、二叉树排序、计数排序、桶排序等等;但是本文就简单的先介绍一下冒泡排序和快速排序两种: 冒泡排序应该属于稳定的排序算法;而快速排序则属于不稳定的排序算法。 冒泡排序:名字已经很形象,实际实现是相邻两节点进行比较...

伟哥 724

冒泡排序、快速排序等常用排序算法

常用排序算法 排序算法大体可分为两种: 第一种:比较排序 主要有冒泡排序、选择排序、插入排序、归并排序、堆排序、快速排序等。 第二种:非比较排序 主要有计数排序、基数排序、桶排序等。

lining0420的博客 890

【Java常用排序算法】交换排序(冒泡排序、快速排序)

交换排序 冒泡排序 快速排序 Java实现

一个普本码农奋斗史 2204
上一篇: Redis学习手册(Key操作命令)
下一篇: golang: 常用数据类型底层结构分析
碎炎
博客等级 码龄16年 85粉丝 61原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值