快速排序(详解)

快排(动图详细版,快速理解) 快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法,其基本思想为:任取待排序元素序列中的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右子序列中所有元素均大于基准值,然后最左右子序列重复该过程,直到所有元素都排列在相应位置上为止。 阅读详情
#include<iostream>
#include<cstdlib>
#include<ctime>
using namespace std;
void swap(int &small, int& big)
{
	int temp;
	temp = small;
	small = big;
	big = temp;
}

void qSort(int arr[], int left, int right )
{
	int i, j, base;
	if (left < right )
	{
		i = left;
		j = right+1;//这里加1是因为do{j--}while(arr[j] > base )执行的是j--
		base = arr[left];
			do
			{
				/*
				|把变量base赋值为arr[left]即arr[0],以base为参照物
				|这里选择升序排序,即小数值在前面(即左边),大数值放后面(即右边),这里很关键!!!
				|游标i从左向右迭代,当arr[i]小于base时继续前进,即i++,如上述所说这里是升序排列
				|当游标i移动到arr[i]>base时,停止循环。
				*/
				do
				{
					i++;
				}while (arr[i] < base);
				/*
				|同样选择base作为参照物,游标j从右向左移动,如前面所述这里是升序排列
				|所以当j移动到arr[j]>base时,继续移动(这里是向左移动),即保持大数值在右边
				|当j移动到arr[j]<base时停止循环
				*/
				do{
					j--;
				}while(arr[j] > base);

				/*
				|(附注)这里要判断(i<j)是因为在重复多次递归排序后,i左边的值要小于j右边的值。
				|此时若交换则会造成数值排序混乱
				|反观此处的目的,arr[i]是大于base的值,arr[j]是小于base的值
				|(因为在每一个时刻都用base左参照物)
				|所以交换arr[i]和arr[j],让小数值放在左边,大数值放在右边。
				|也正如上面所说这里是升序排列
				*/
				if (i < j)
					swap(arr[j], arr[i] );
			}while(i<j);
			/*
			|swap(arr[j], arr[left])这个函数可能比较难以理解
			|大家可以想象一下,上面的最外层do{...}while(i<j)为何终止并退出循环?
			|因为刚开始循环时i从左至右,j从右向左,所以随着循环的进行
			|当满足arr[i]>base,arr[j]<base时,j有可能出现在i的左边,所以会退出循环
			|
			|
			|但关键是这里为何交换arr[j]和参照物base==arr[left]呢?
			|因为		do{
			|				j--;
			|			  }while(arr[j] > base);
			|循环终止的原因是arr[j]<base(即arr[left]).
			|所以这里要交换arr[j]和arr[left]
			|交换的理由还是因为升序排列,小数值在左,大数值在右。
			|
			|
			|反观如果不交换arr[j]和arr[left](即base)的值会如何?
			|
			|如果不交换那么这个base在每次递归调用中永远处于最左边,也就没有加入排序。
			*/
			swap(arr[j], arr[left]);
			/*
			|	if (arr[j] != arr[left])
			|		swap(arr[j], arr[left]);
			|附注:上面执行do{j--}while(arr[j] > base )
			|j在向左移动时,可能在arr[j]=base时,这时候do{..}while循环也是会终止的
			|所以在他们不相等,才交换,反过来说就是不对单原子本身执行交换
			*/
			//递归调用
			qSort(arr, left, j-1);
			qSort(arr, j+1, right);
	}//if(left < right)

}

#define SIZE 1000

//进行过百万级别测试。
void main()
{
	int iArray[SIZE];
	//time()传入NULL值时返回当前系统时间。
	srand(unsigned int(time(NULL)));
	for (int i = 0; i <= SIZE; i++)
		iArray[i] = int(rand()%500+1);
	
	qSort(iArray, 0, SIZE);

	for (int j = 0; j <= SIZE; j++)
		cout << iArray[j]<<" ";

		cin.get();

		return;
}
/*
附注:快速排序函数内最后还是换上这句:
if (arr[j] != arr[left])
	swap(arr[j], arr[left]);
当arr[j]和arr[left]相等时不进行交换,在极限测试里相等还交换会带来极大开销
比如:调用swap()函数时,会产生函数调用时间 和 临时堆栈空间 以及释放临时堆栈的时间。
而相比cpu的速度计算两个数是否相等时是很快的。
*/

R语言分段回归 1.利用虚拟变量进行线性回归 (MEdata.csv的数据来源:https://github.com/ChenQihome9/优快云-Data-Library/blob/master/MEdata.csv) 问题13:针对TAX~GDP,使用分段回归方法,找到其回归方程。编程,并根据程序结果叙述如下几方面问题:(1)分几段最佳?(不超过5段内)(2)分段位置定在哪儿最佳?(3)写出最佳方... 阅读详情

相关推荐

Chipyard------介绍与环境搭建

Chipyard是一个开源的、可扩展的、集成化的芯片设计平台,旨在帮助芯片设计人员快速、高效地开发自己的定制芯片。由伯克利大学架构研究小组开发,它基于Chisel语言和Scala编程语言,提供了一整套硬件设计工具和流程,包括RTL设计、验证、物理布局、仿真等,以及支持多种芯片体系结构的库和模块。

qq_38798111的博客 9479

快速排序算法动图演示及解析2021版(附Java代码实现)

1、快速排序算法实现方式 快速排序的核心思想是分治法,分而治之。它的实现方式是每次从序列中选出一个基准值,其他数依次和基准值做比较,比基准值大的放右边,比基准值小的放左边,然后再对左边和右边的两组数分别选出一个基准值,进行同样的比较移动,重复步骤,直到最后都变成单个元素,整个数组就成了有序的序列。 简单概括如下: 从数列中挑出一个元素,称为 “基准”(pivot); 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退

qq_38082146的博客 9308

FPGA开发中Quartus与Modelsim联合仿真配置与调试全攻略

在数字电路设计与FPGA开发中,仿真验证是确保逻辑功能正确性和时序性能达标的核心环节。其基本原理是通过软件模拟硬件电路的行为,在设计转化为实际硬件前发现潜在缺陷。这项技术的核心价值在于大幅降低开发风险与成本,提升设计可靠性,广泛应用于通信、嵌入式系统、芯片验证等领域。对于使用Intel FPGA平台的开发者,Quartus Prime作为官方综合布局布线工具,其内置仿真器在应对复杂设计、深度调试和自动化测试时存在局限。此时,引入专业仿真工具Modelsim进行联合仿真成为提升验证效率的关键实践。通过搭建自动

weixin_33736048的博客 451

【C语言】快速排序——动图演示

快排的时间复杂度是On∗lognO(n*logn)On∗logn递归版本有缺陷,就是在建立太多栈帧情况,不能及时返回就会栈溢出。非递归就能解决该问题,效率上二者差不多。快排的三种实现方法(hoare版(左右指针法),挖坑法,前后指针法)和两种优化(三数取中、小区间优化),非递归都详细的说明了,请大家还是要多多画图和调试,走读代码才能更加牢固的掌握。

Eraser的博客 2561

Android 集成 Google 与 Facebook 第三方登录实战详解(2024版)

本文详细介绍了2024年Android应用集成Google与Facebook第三方登录的完整实战指南。通过分步教程和代码示例,帮助开发者快速实现一键登录功能,提升用户体验和注册转化率,同时涵盖隐私合规和常见错误处理的最佳实践。

blue的专栏 822

CA(载波聚合)

文章目录CA基本概念1. CA分类2. Pcell、Scell以及Serving CellPcell(Primary Cell)Scell(Secondary Cell)3. Pcell、Scell部署场景场景1场景2场景3场景44. CA的协议控制4.1 Camping/Connetion Establishment:4.2 CC Management/SCell Addition/Release:4.3 Handover/Measurements:4.4 SCell激活 CA基本概念 CA也就是我们中文

你又来看我了,一起学习吧 4万+

快速排序(讲解+动图直观过程)

快速排序 必冒泡排序法更快的排序方法:快速排序` 该方法的基本思想是: 1.先从数列中取出一个数作为基准数。(一般为了方便通常取第一个) 2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。 3.再对左右区间重复第二步,直到各区间只有一个数 简言之:挖坑 + 分治 实现过程(第一部分): ( i从前寻找比基准数大的,j从后寻找小的) 分成两个区间重复上面的过程。 总结: 1.i =str; j = end; 将基准数挖出形成第一个坑a[i]。 2.j- -由后向前找比它小的数,找

张^老头的博客 3446

电机系列(1) - foc最基本原理、clark变换 、park变换、附代码

什么是FOC? FOC(Field-Oriented Control),直译是磁场定向控制,也被称作矢量控制 (VC,Vector Control) ,是目前无刷直流电机(BLDC)和永磁同步电机(PMSM)高效控制的最优方法之一。FOC旨在通过精确地控制磁场大小与方向,使得电机的运动转矩平稳、噪声小、效率高,并且具有高速的动态响应。 简单来说就是,FOC是一种对无刷电机的驱动控制方法,它可以让我们对无刷电机进行 “像素级” 控制,实现很多传统电机控制方法所无法达到的效果。 因为所谓的“矢量控制”其实就是

nepqiu的博客 7万+

快速排序算法动图演示及解析2024版(附Java代码实现)

学完之后,若是想验收效果如何,其实最好的方法就是可自己去总结一下。比如我就会在学习完一个东西之后自己去手绘一份xmind文件的知识梳理大纲脑图,这样也可方便后续的复习,且都是自己的理解,相信随便瞟几眼就能迅速过完整个知识,脑补回来。下方即为我手绘的MyBtis知识脑图,由于是xmind文件,不好上传,所以小编将其以图片形式导出来传在此处,细节方面不是特别清晰。但可给感兴趣的朋友提供完整的MyBtis知识脑图原件(包括上方的面试解析xmind文档)

2401_84048398的博客 1334

微信小程序|基于小程序实现人脸识别对比

此文主要通过小程序实现对比人脸相似度,并返回相似度分值,可以基于分值判断是否为同一人。人脸登录、用户认证等场景都可以用到。

商务合作 / 项目定制 / 学习交流。个人vx:lovely_wml 2万+

DTI-ALPS处理笔记

前段时间刚好学习了一下DTI-ALPS处理(diffusion tensor image analysis along the perivascular space ),记录一下,以便后续学习。ALPS是2017年发表在《Japanese Journal of Radiology》的一篇文章首次提出的 (),主要用于无创评估脑内淋巴系统功能的衡量数值。C图和D图中的蓝色部分是投射纤维,绿色部分是联合纤维,红色部分是皮下纤维。

weixin_52073820的博客 4791

快速排序详解

1.什么是快速排序 我们知道排序有很多种,常见的如希尔排序,插入排序,选择排序,堆排序等等,而快速排序也是排序家族中的一员。因为其在大多数情况下有着优秀的综合性能,快速排序的快速也算是实至名归,接下来就为大家讲解快速排序的思想与实现。 2.快速排序的核心思想 快速排序通过多次比较与交换来完成排序。而这个过程又被分为了多次重复单趟排序,接下来我们先从每一趟的排序讲起。 快速排序的单趟排序思想是: 在一个无序数组中取一个数key,每一趟排序的最终目的是:让key的左边的所有数小于key,key的右边都

LiangXiay的博客 11万+

FPGA原型验证(七):如何选择、搭建原型验证平台?

本篇概要::讨论了在项目初期选择目标FPGA平台的重要性,包括自制板卡与购买现成板卡之间的决策。主要是为那些希望建立基于FPGA的原型平台的工程师和设计师提供了深入的技术细节和决策指导,无论是选择自制还是购买现成的解决方案。

叫好与叫座虽然不是对立面,但想在同一个作品中达到双重效果很难。 943

快速排序算法详解

目标:将数组按从小到大排序 算法思想:快速排序的基本思想是基于分治法的。分治法是什么呢?就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。(没错就是百度来的) 算法描述:在待排序数组中任取一个元素pivot作为枢轴,通过一趟排序,将待排序数组划分为两个部分,A[1...k-1]和A[k+1...

Zhu_Zhu_Wonder的博客 2174

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

快速排序——详解

快速排序(英语:Quicksort),又称分区交换排序(英语:partition-exchange sort),简称「快排」,是一种被广泛运用的排序算法。三路快速排序(英语:3-way Radix Quicksort)是快速排序和基数排序的混合。它的算法思想基于荷兰国旗问题的解法。内省排序(英语:Introsort 或 Introspective sort)4是快速排序和堆排序的结合,由 David Musser 于 1997 年发明。内省排序其实是对快速排序的一种优化,保证了最差时间复杂度为。

w_w_wwwww的博客 1374

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

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

快速排序全面详解

快速排序全面详解

qq_63981383的博客 3729

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

java快速排序详解

快速排序

爱学习的小蜗牛的博客 880

Java快速排序详解

Java快速排序详解 快速排序(Quicksort)的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

ninggezhenbang的专栏 585
上一篇: 插入排序
下一篇: 二元搜索
错_对
博客等级 码龄16年 68粉丝 80原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值