升级版快速排序——随机化快速排序

算法导论(一):快速排序与随机化快排 快速排序用到了分治思想,同样的还有归并排序。乍看起来快速排序和归并排序非常相似,都是将问题变小,先排序子串,最后合并。不同的是快速排序在划分子问题的时候经过多一步处理,将划分的两组数据划分为一大一小,这样在最后合并的时候就不必像归并排序那样再进行比较。但也正因为如此,划分的不定性使得快速排序的时间复杂度并不稳定。 阅读详情

随机化思想的引入

在数据结构这门课程的学习中,我们了解到一种名为快速排序的算法,该算法时间复杂度为O(nlog⁡2n)O(n\log_2 n)O(nlog2​n),但是,在课程中,书本和老师都指出了它的一个缺点:在数据有序时的时间复杂度为O(n2)O(n^2)O(n2)

为了“消除”这个缺点,随机化的思想被引入到快排中:由于数据有序,可以随机选取其中一个数将其与其他数交换,使有序的情况被破坏,从而使原有序数据的排序效率加快。

普通快排的实现

  • 基本思想:
    将数据划分为两部分,左边的所有元素都小于右边的所有元素;然后,对左右两边进行快速排序。

  • 划分方法:
    选定一个参考点(中间元素),所有元素与之相比较,小的放左边,大的放右边。

  • 具体划分方法:
    选择第一个元素作为中间元素。
    划分:
    (1)先保存该元素的值到其它位置,腾出其空间。
    (2)从后往前搜索一个比中间数小的元素,并将其放置到前面的这个空位上。
    (3)从前往后搜索一个比中间数大的元素,并将其放置到后面的这个位置上。
    重复(2),(3),直到两边搜索的空位重合,此时将中间元素放在该空位中。

	template<typename T>
void quick_sort(T array[], int left, int right)
{
	if (left >= right) return;
	int i = left, j = right;
	T temp = array[left];
	while (i != j)
	{
		while (array[j] > temp&&j > i) j--;
		if (i < j) array[i++] = array[j];
		while (array[i] < temp&&i < j) i++;
		if (i < j) array[j--] = array[i];

	}
	array[i] = temp;
	quick_sort(array, i + 1, right);
	quick_sort(array, left, i - 1);
}

随机化快排的实现

随机化快排只是比普通快排增加了一个步骤:首先随机选取一个元素,与数据群首部元素交换,接下来进行快排

template<typename T>
void random_quick_sort(T array[], int left, int right)
{
	srand(time(0));
	if (left >= right) return;
	int i = left, j = right, move = rand() % (right - left + 1) + left;
	T temp = array[move];
	array[move] = array[left];
	while (i != j)
	{
		while (array[j] > temp&&j > i) j--;
		if (i < j) array[i++] = array[j];
		while (array[i] < temp&&i < j) i++;
		if (i < j) array[j--] = array[i];

	}
	array[i] = temp;
	random_quick_sort(array, i + 1, right);
	random_quick_sort(array, left, i - 1);
}
快速排序为什么要随机化 排序的方法有很多,快排算是一种相对高效的排序方法,往日写快排都是依照记忆中的代码,每次选取数组中第一个元素或者最后一个元素为关键字进行排序,今日被问到快排为什么要随机化时,发现自己完全答不上来?所以查阅书籍,重新学习快排。   首先对普通快排进行复杂度分析,快排的时间复杂度取决于递归的深度,为了方便表示,这里用递归树来解释快排的运行模式,以{5,1,9,3,7,4,8,6,2}{5,7,8,6,3 阅读详情

相关推荐

Java实现随机化快速排序

题目描述: 使用Java或C++等语言中内置的随机函数实现随机化快速排序,在数组中随机选择一个元素作为分区的主元(Pivot)。 输入: 多组样例输入,每组由一个一维整型数组组成。 输出: 随机化快速排序之后的一维整型数组(升序排列)。 样例输入 : 6 1 8 6 5 3 4 5 12 42 2 5 8 样例输出 : 1 3 4 5 6 8 2 5 8 12 42 解决思路:这主要是对一个排列a...

hookind's blogs 633

随机化算法:快速排序与选择算法及选择算法最坏情况的剔除

像快速排序的运行时间是根据输入序列顺序来决定的,但是我们选择了随机化算法,将运行时间独立于输入序列顺序,收随机生成器的影响

qq_42146775的博客 1456

实验室LIMS系统选型指南:从赛默飞到金现代,5大主流方案横评

本文深入分析了实验室LIMS系统选型的5大核心维度,包括架构选择、行业适配性、合规性设计、智能化程度和成本模型。通过对比赛默飞、金现代等主流厂商的优劣势,提供实战避坑策略,帮助实验室管理者做出明智决策,提升运营效率和合规水平。

plum99的博客 259

快速排序之随机化

快速排序的思想就是把每个数

u011634033的专栏 796

叶绿体基因组提交NCBI全流程避坑指南

叶绿体基因组作为环状细胞器DNA,其数据提交并非简单上传,而是需严格遵循INSDC标准的学术出版行为。其核心原理在于元数据完整性、拓扑结构语义一致性与分类学路径精确匹配;技术价值体现在保障序列可追溯、可复现、可互操作;典型应用场景涵盖植物系统发育、条形码开发及合成生物学底盘构建。实践中,FASTA头行格式、feature table嵌套规则、taxid绑定及BankIt静默校验等环节极易引发失败。本文聚焦NCBI|叶绿体基因组数据上传中的高频报错与隐性约束,提供面向生物信息工程师的实操级规范解析。

weixin_31960565的博客 326

RAGFlow本地部署遇阻:解析进度卡顿的排查与修复指南

本文针对RAGFlow本地部署中常见的文档解析进度卡顿问题,提供了详细的排查与修复指南。核心原因是模型下载网络受阻,解决方案是通过修改环境配置文件,将模型下载源切换至国内镜像站,从而快速解决解析停滞问题。

weixin_29297127的博客 341

排序之随机化快速排序

快速排序由 C. A. R. Hoare 在 1960 年提出。随机化快速排序基本思想:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

2302_77624868的博客 562

Creo二次开发环境配置与DLL项目实战指南(Creo8.0+VS2019)

本文详细介绍了Creo8.0与VS2019环境下的二次开发配置与DLL项目实战指南,涵盖环境准备、版本匹配、DLL项目创建、核心代码编写、部署调试及常见报错处理。重点解析了Creo二次开发中的关键配置和优化技巧,帮助开发者高效解决实际问题。

weixin_28432777的博客 517

算法-排序算法:快速排序(QuickSort )【O(nlogn)】【单路:随机化无法避免元素全相等时退化为O(n^2)】、【双路+随机化:元素全相等时退化概率极低】【三路:元素全相等时为O(n)】

4、快速排序(Quick Sort)O(nlogn) 快速排序(Quick Sort)的基本思想:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。 2.1 快速排序-算法描述: 快速排序使用分治法来把一个串(list)分为两个子串(sub-lists)。具体算法描述如下: 从数列中挑出一个元素,称为 “基准”(pivot); 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后

u013250861的博客 1696

Comsol超声空化气泡仿真入门:从零搭建模型到网格划分的完整流程

本文详细介绍了使用Comsol进行超声空化气泡仿真的完整流程,从物理基础理解到模型搭建、网格划分及求解器设置。通过具体步骤和示例代码,帮助初学者和工程师快速掌握这一关键技术,应用于医疗设备和工业清洗等领域。

weixin_29289821的博客 165

【机械臂算法】基于最小惯性参数集的动力学辨识仿真实践

本文深入探讨了机械臂动力学参数辨识的核心挑战与解决方案,重点阐述了基于最小惯性参数集的理论与方法。通过分析PUMA560实例,详细介绍了利用QR分解法或符号推导法获取可辨识参数集,并系统讲解了从激励轨迹设计、仿真数据采集、线性系统求解到模型验证的完整实践流程,为高精度动力学建模与控制奠定了坚实基础。

weixin_29054399的博客 376

【随机化快速排序算法】详解:原理、图示与Java实现

快速排序(Quick Sort)是由英国计算机科学家C. A. R. Hoare于1960年提出的经典排序算法。随机化快速排序是其改进版本,通过引入随机性来避免最坏情况的发生。

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 8158

高德地图API如何使用

通过以上步骤,您可以成功接入并使用高德地图API来为您的应用添加丰富的地图功能。

QQ_778132974的博客 4784

随机化快速排序

随机化快速排序是一种改进的快速排序算法,通过随机选择枢轴避免最坏情况,平均时间复杂度为O(n log n)。相比标准快速排序,它在处理已排序或特定分布数据时表现更稳定。算法通过随机选择枢轴、分区和递归排序实现,空间复杂度为O(log n)。虽然存在最坏情况O(n²)的可能性,但概率极低。适用于大型数据集和通用排序场景,但不是稳定排序。代码实现通常包括随机枢轴选择、分区和递归调用等步骤。

m0_57545130的博客 934

【RT-DETR改进涨点】ResNet18、34、50、101等多个版本移植到ultralytics仓库(RT-DETR官方一比一移植)

本文是本专栏的第一篇改进,我将RT-DETR官方版本中的ResNet18、ResNet34、ResNet50、ResNet101移植到ultralytics仓库,网上很多改进机制是将基础版本的也就是2015年发布的ResNet移植到ultralytics仓库中,但是其实RT-DETR实验的ResNet和其是有很大区别的在其中有很多细节上的不同(文章中我也会列出举例)

Snu77的博客 7221

蓝牙模块HM-10手册

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

随机化快速排序(Java 实例代码)

快速排序由 C. A. R. Hoare 在 1960 年提出。通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

2301_78835635的博客 2888

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

快速排序与随机化快排运行速度实验比较

目录 快速排序与随机化快速排序. 2 快速排序. 2 随机化快速排序. 3 快排与随机化快排性能分析. 4 不同配置的计算机运算效果. 4 不同初始序列对快速排序的影响. 7 数据相对于其多运算的平均值的波动. 11 总结. 13 问题与不足. 13 参考文献. 13 快速排序与随机化快速排序 在计算机科学与数学中,一个排序算法(英语:S

u012794757的专栏 5600

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

【实验】快速排序和随机化快排的性能比较

1 算法概述 1.1 快速排序 快速排序(Quicksort)是对冒泡排序的一种改进。它由C. A. R. Hoare在1960年提出,也是一种交换排序。它采用了分冶法,基本思路如下: 先从数列中取出一个数作为主元。 分区过程:把比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。 再对左右区间重复第二步,直到各区间只有一个数。 快速排序的最优情况是每一次取到的元素都刚好平分整个数组...

blingblingbing_的博客 2342

快速排序的随机化版本

快速排序的研究一直在继续,研究的关键就是其基准点base的选取。对base点取随机数可以获得较好的平均情况性能。         参考:快速排序的优化算法(非随机取base)         代码如下: #include #include #include #include //函数原型 void swap(int *a,int *b); int partition(int A[]

Neil的博客 5313

算法小课堂(十)随机化算法

随机化算法概述是一个关于随机化算法的简单介绍。随机化算法是一种在算法中使用了随机函数的算法,随机函数的返回值会影响算法的执行流程或结果1。根据算法的性质,随机化算法可以分为数值随机算法、舍伍德算法、拉斯维加斯算法和蒙特卡罗算法。

qq_62377885的博客 4670

快速排序与随机化快速排序

1. 快速排序 介绍 快速排序是一种在最坏情况下时间复杂度为O(n2)的排序算法,但在实际应用时却是较好的选择,因为快速排序的期望时间复杂度为O(nlgn),其中隐藏的常系数非常小,快速排序也能像堆排序一样,可以就地排序。 快速排序也是利用分治策略的思想,其过程分为: 分解:将一个数组分为两个子数组,一个数组的所有元素都小于或等于数组的主元,另外一个数组则都大于数组的主元。主元是在数组划分之前预先设定的值,一般选择数组最后一个元素作为主元。 求解:递归的调用快速排序算法,对分解的两个子数组进行快速排序。

sliv_ery的博客 1457

随机化快速排序算法

转载出处:http://www.cppblog.com/liyuxia713/archive/2010/01/24/106332.html Quicksort是一个很好的排序算法,但是其最坏情况运行时间是O(n^2), 还不如Mergesort的O(nlgn), 如何改进Quicksort? 引进随机化思想 一种方法: 对给定的待排序序列,随机地重排列另一种方法:随机选取

Noshandow的专栏 1225

快速排序(随机化+非随机化)

随机化快速排序 基本思想 例子:在这里插入代码片 非随机化快速排序代码展示 分区函数 进行上图一二步 int partition(int a[],int left,int right){ int x=a[left];//取第一个数和每个数比较,称为比较数 int i=left; int j; for(j=left+1;j<=right;j++){ ...

weixin_45899951的博客 333

快速排序和快速排序的随机化版本

1、概述 快速排序算法中,采用分治思想,每次调用partition函数对当前规模的数组进行处理,如何处理呢: (1)选择一个主元素,何为主元素,可以理解为电视中主角,此主角在这次调用partition(arr,left,right)后将会找到它的最终位置,使得它的左侧数据都比不大于它,右侧元素都不小于它(由此可知,此快速排序算法是原址排序,直接在原数组中进行排序),同时这个方法将会这个主元的下...

wangqsse的博客 535

常见排序算法:随机化快速排序算法

基本思想:在快速排序的思想上,对基数的选择采用了一个随机化的选择。 1.对于递归到某一层的数组中,在该数组中随机化选择一个数字,把数组中的数字分为两部分,比该数字小的数据都放在它的左边,比该数字大的数据都放在它的右边。 2.适用递归的思路对每次选出来的数字的左右两边进行排序。 代码: #include <iostream> #include<time.h> usi...

u011441044的博客 3107
上一篇: 如何计算算法时间复杂度?主定理(主方法)!
下一篇: 线性时间找到第k小的元素:快排应用与BFPRT算法
RealWeakCoder
博客等级 码龄7年 236粉丝 68原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值