算法-排序-快速排序(QuickSort)分析

超级快排:Ultra-QuickSort 刚开始看到这道题的时候,我就觉得很简单啊,不就是求逆序对吗,于是,我写了一个特殊的bubble(就是冒泡排序,因为要计数,所以不能用STL库里面的sort),果然,超时了!(因为超时过于严重,所以就不发图片了) 阅读详情
题目:算法-排序-快速排序(QuickSort)分析
摘要:
此文介绍了快速排序的算法以及基本分析,最后总结。
此系列文均为方便日后重复粗略查看时不必翻看书籍。
http://jackaldire.com/200908/quick-sort-analysis/ 快速排序详细分析 
给出了非常详细的PARTITION时各种扫描方式, 以及介绍分治时尾递归的方式。
值得学习
 
简要介绍

快速排序通过划分数组为分别大于和小于key的两个连续部分,进而递归实现排序。

它的特点包括:

1. 就地排序(in place): 不需要更多的内存空间

2. 递归调用:思路简单

运行时间:

1. 最坏情况clip_image002[14]

2. 平均情况 clip_image004[4] 而且隐含的常数因子很小。 (何谓隐含的常数因子?…, TO BE IDTENDIFIED)

算法过程
Quick Sort过程 ([2],P85)

QUICKSORT(A , p , r )

1 if p < r

2 then q ← PARTITION(A , p , r )

3 QUICKSORT(A , p , q - 1)

4 QUICKSORT(A , q + 1, r )

 
Quick Sort中用到的PARTITION过程 ([2],P85)

PARTITION(A , p , r )

1 xA [r ]

2 ip - 1

3 for jp to r - 1

4 do if A [j ] ≤ x

5 then ii + 1

6 exchange A [i ] ↔ A [j ]

7 exchange A [i + 1] ↔ A [r ]

8 return i + 1

clip_image006[5]







 
 
下图([2] 图7-2)非常好的描述了PARTITION过程中数组元素的位置分布情况。
clip_image007[5]







下面简单介绍一下PARTITION的循环中某一次的数据编排方式:
IF (Array[j] > x, 
                    j++ 
ELSE 
                    i++, j++,
                    exchange Array[i] <-> Array[j-1]
 
算法简单分析
算法简单分析中,将着重以传达意思为主,不会涉及严格的数学公式证明。



注意:每次划分n个元素的时间代价为 thet(n). 不论划分结果如何.



假设对n个元素排序所需时间为 T(n)







最坏情况:


最坏情况为划分的两个区域分别包含 n-1 个 和 0 个元素,

即:每次划分选取的基准都是当前无序区中关键字最小(或最大)的记录。

这样接下来的n-1个元素划分的时间为T(n-1)。



这样我们得到



T(n)=T(n-1)+thet(n)



看到这个公式,根据基本概念,可以知道其复杂度为thet(n平方). 当然也可以通过[2]中的主定理证明。



思考:如果输入数据已经排好序,不论正序或者倒序,都将造成最坏情况。







最佳情况:


最佳情况为两个区域个包含 n/2个元素,这样



T(n)=2T(n/2)+thet(n)



再由主定理 复杂度为 thet(nlgn)











思考1:merge sort的公式为T(n) = 2 T(n/2) + thet(n), 其时间复杂度为 thet( n * log n ). 为什么不直接使用merge sort?



因为merge sort需要太多的memory。



思考2:这里,我们一定要有这样的思维,目前我们碰到的merge sort, quick sort都出现了T(n) = T ( an+b ) + thet(n)类似的公式。



也就是说,有可能大部分简单的排序算法都可以通过分而治之(divide and conquer), 分步法等简要直白的方式,将问题简化为此类公式。



此公式方便的打开了算法分析之门。



思考3:merge sort最大可能使用多少内存?TODO










我们知道,我们无法决定每次划分的情况。但是我们知道只要每次划分出现一定随机化分布,就会得到比较好的划分结果,至少不会最差。



我们通过每次选择参照的元素时,不直接选取最后一个,而是随机选取(random sampling),就可以轻易达到效果。



同时,不用担心对原有PARTITION程序的乖动,我们只要在随机选取后,将随机样本与数组最后元素交换位置即可。



如下:



RANDOMIZED-PARTITION(A, p, r)



1. i <- RANDOM(p, r)



2. exchange A[r] <-> A[i]



3. PARTITION(A, p, r)







RANDOMIZED-QUICKSORT(A, p, r)



1. if p < r



2. then q <- RANDOMIZED-PARTITION(A, p, r)



3. RANDOMIZED-PARTITION(A, p, q-1)



4. RANDOMIZED-PARTITION(A, q+1, r)











算法进一步分析






TODO
总结
TODO。
 
参考文献:
[1]. 算法分析导论 Section1.4平均情形分析,1.5例:快速排序的分析
[2]. 算法导论,CH,V2,  Chapter 7 快速排序
 
Ultra-QuickSort 如果题目中的“Ultra-QuickSort”指的是某种更高效的排序算法,则此代码可能无法正确模拟。但根据题目的描述,这个算法仅通过交换相邻元素进行排序,所以以上代码应该符合题意。请注意,真正的快速排序通常不会按照这种方式(只交换相邻元素)进行操作,其交换元素的距离可能远大于相邻位置。实际的快速排序平均时间复杂度为O(n log n),而上述代码的时间复杂度是O(n^2)。由于题目中没有具体说明Ultra-QuickSort算法的具体实现细节,我们将假设它始终将较小的元素交换到前面(类似于冒泡排序)。 阅读详情

相关推荐

Linux下科大讯飞离线语音识别SDK从下载到实战(附常见问题解决)

本文详细介绍了在Linux系统下,如何从科大讯飞开放平台获取离线语音识别SDK,完成环境准备、编译部署到实战开发的完整流程。文章重点解析了SDK目录结构、语法词典定制、示例代码修改,针对开发中常见的“词典加载失败”、音频格式、交叉编译及性能优化等问题提供了深度解决方案,助力嵌入式与IoT开发者快速实现稳定可靠的离线命令识别功能。

honey的博客 1190

快速排序算法Quicksort()

分治算法实现快速排序,运用Quicksort()和Partition()函数 的过程为,先从后向前扫描数组A,找到第一个不大于的元素,然后从前扫描A找到第一个不大于的元素,当时,交换与。这时 后面的数都大于 ,前面的数都小于 ,重复上述操作,直到与相遇。当,就代表了在排好序的数组中的正确位置q。此时在q位置之前的元素都不大于,在q位置之后的元素都大于。根据上述过程,

weixin_52075165的博客 1018

Qt (高仿Visio)流程图组件开发(一) 效果展示及基本开发框架构思

最近因为工作原因需要使用Qt开发一个类似于Visio的流程图组件,需满足基本的流程图功能,图元类型可自定义扩展,不同图元存有各类自定义数据,可以保存为xml文件,可以读取xml文件生成流程图等等。

qq_43793182的博客 1万+

蓝桥杯 ADV-297 算法提高 快速排序

算法提高 快速排序 时间限制:1.0s 内存限制:256.0MB 问题描述   用递归来实现快速排序(quick sort)算法快速排序算法的基本思路是:假设要对一个数组a进行排序,且a[0] = x。首先对数组中的元素进行调整,使x放在正确的位置上。同时,所有比x小的数都位于它的左边,所有比x大的数都位于它的右边。然后对于左、右两段区域,递归地调用快速排序算法来进行排序。   输...

荔枝的FM 1222

快速排序Quicksort

快速排序是基于分治策略的另一种排序算法快速排序(1) 基本思想是,对于输入的数组a[p : r]按照分解,递归求解,合三个步骤进行排序。 分解:以a[p : r]中的p为基准将原数组分成三段,分别是a[p : q - 1],a[q],a[q + 1:r]。下标q在划分过程中确定。 void QuickSort(Type a[], int p, int r){ if(p < ...

weixin_43873373的博客 1131

快速排序

快速排序: 时间复杂度:时间复杂度主要取决于每次拆分的时间。是n*log(n) 空间复杂度:在合的时候,没有使用额外的存储空间,所以时间复杂度是O(1) 原地排序算法:是原地排序算法。 稳定排序算法:在排序的时候,前后大小相等的元素,不能保证排序后的顺序一致。 如果从前往后排,则比中间值大的元素不能确保顺序一致, 如果从后往前排,则比中间值小的元素不能确保顺序。 时间复杂度计...

Memorys 202

postgresql分页用法_postgresql分页数据重复问题的深入理解

问题背景许多开发和测试人员都可能遇到过列表的数据翻下一页的时候显示了上一页的数据,也就是翻页会有重复的数据。如何处理?这个问题出现的原因是因为选择的排序字段有重复,常见的处理办法就是排序的时候加上唯一字段,这样在分页的过程中数据就不会重复了。 关于这个问题文档也有解释非是一个bug。而是排序时需要选择唯一字段来做排序,不然返回的结果不确定排序返回数据重复的根本原因是什么呢?经常优化sql的同学可...

weixin_35089715的博客 1692

快速排序Quicksort算法的运算时间的全面分析

zhouwen5288的专栏 2582

算法设计与分析快速排序QuickSort

快速排序QuickSort:既然能把冒泡KO掉,马上就激起我们的兴趣,tnd快排咋这么快,一定要好好研究一下。 首先上图:    从图中我们可以看到:left指针,right指针,base参照数。其实思想是蛮简单的,就是通过第一遍的遍历(让left和right指针重合)来找到数组的切割点。第一步:首先我们从数组的left位置取出该数(20)作为基准(base)参照物。第二步:从数组的right位置...

BigCowPeking 2124

算法分析排序:交换排序之二——快速排序QuickSort

快速排序Quicksort)是对冒泡排序的一种改进。由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。 设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通

云梯 1040

算法设计与分析-------快速排序quicksort)

一.算法思路 快速排序算法是基于分治策略的一个排序,是对冒泡排序的一种改进。于C.A.R.Hoare在1960年提出。它的基本思想为,通过一趟排序将待排序的部分分割成独立的两部分,其中一部分关键字均比另一部分小,则可对这两部分分别进行排序。 假设有任意输入子数组arr[low:high],则可按以下三个步骤进行: 分解:设定以arr[low]元素为基准,将arr[low:high]分为三个部分arr[low:base-1],arr[base],arr[q+1,base],其中arr[low:base-1]

m0_54238983的博客 4387

数据结构与算法分析-C++描述 第7章 快速排序quickSort

快速排序quickSort): 快速排序quickSort算法曾被认为是理论上高度优化而实践中不可能正确编程的一种算法,但该算法简单易懂且不难证明,像归算法一样,快速排序也是一种分而治之的排序算法。 行为描述: 算法描述: 1、枢纽元的选取:通常做法为选择数组中起始下标、中间下标和末尾下标对应的元素的中值已产生比较“平衡”的枢...

qq_37172182的博客 432

用Python实现快速排序(Quicksort)算法

1.快速排序(Quicksort)算法介绍 快速排序Quicksort)是对冒泡排序的一种改进,但是不是稳定的排序算法 2.算法思想 1)设置两个变量i、j,排序开始的时候:i=0,j=N-1; 2)以第一个数组元素作为关键数据,保存在key中,即key=A[0]; 3)从j开始向前搜索,即由后开始向前搜索(j--),找到第一个小于key的值A[j],用A[j]覆盖A[0], 4...

Age 1万+

快速排序 算法摘记

详细见算法导论,直接上实现;

小人物的草稿本 936

c++ 快速排序QuickSort

为了缓解最坏的情况,使用了各种技术,例如选择一个好的主元(例如,三的中位数)使用随机算法(随机快速排序)在排序之前对元素进行混洗。分区的目标是将主元(可以选择任何元素作为主元)放置在已排序数组中的正确位置,将所有较小的元素放在主元的左侧,将所有较大的元素放在主元的右侧。它不是稳定的排序,这意味着如果两个元素具有相同的键,在快速排序情况下,它们的相对顺序将不会保留在排序的输出中,因为这里我们根据枢轴的位置交换元素(不考虑它们的原始位置)职位)。QuickSort 中的分区:将枢轴与 80 进行比较。

csdn_aspnet的专栏,请点击博客主页右上角三个点中的私信联系 9万+

Java 中的快速排序算法实现-Quick sort

快速排序

ljmlh1219的博客 9281

c语言简单快速排序原理,快速排序原理、复杂度分析及C语言实现

快速排序是一种最坏情况时间复杂度为的排序算法。虽然最坏情况的时间复杂度很差,在在实际应用中是最好的选择,平均性能很好:期望时间复杂度,而且隐含的常数因子非常小。另外,它还能够进行原排序,在虚拟环境中也能很好工作。基于随机抽样的快速排序算法,在输入元素互异的情况下,期望运行时间为。1.基本思想快速排序利用了分治策略。分治策略可以分为3个步骤:分解:将问题划分为一些子问题,子问题的形式与原问题一样,只...

weixin_29887021的博客 1123

C语言实现快速排序法(分治法)

title: 快速排序法(quick sort) tags: 分治法(divide and conquer method) grammar_cjkRuby: true --- 算法原理 分治法的基本思想:将原问题分解为若干个更小的与原问题相似的问题,然后递归解决各个子问题,最后再将各个子问题的解组合成原问题的解。 利用分治法可以将解决办法分为 “三步走” 战略: (1) 在数据集中选定...

a153250的博客 5039

QuickSort 快速排序

quickSort 快速排序算法 借鉴《啊哈!算法》这本萌书和python菜鸟教程的想法。 思想: 挑选基准值:从数列中挑出一个元素,称为"基准"(pivot); 分割:重新排序数列,所有比基准值小的元素摆放在基准前面,所有比基准值大的元素摆在基准后面(与基准值相等的数可以到任何一边)。在这个分割结束之后,对基准值的排序就已经完成; 递归排序子序列:递归地将小于基准值元素的子序列和大于基准值元...

weixin_43973433的博客 331

算法导论》笔记——第7章 快速排序

第7章 快速排序 像合排序一样,快速排序也是基于分治模式的。下面对一个典型的子数组A[p…r]排序的分治过程的三个步骤: 分解:数组A[p…r]被划分成两个(可能空)的子数组A[p…q-1]和A[q+1…r],使得A[p…q-1]中的每个元素都小于等于A[q],A[q+1…r]中的每个元素都大于等于A[q],下标q也是在划分过程不断计算的。 解决:通过递归调用快速排序,对子数组A[p…q-1]和...

qq_40287258的博客 234

TLP250功率驱动模块在IRF840 MOSFET中的应用()

摘 要:介绍了功率器件驱动模块TLP250的结构和使用方法,给出了其与功率MOSFET和DSP控制器接口的硬件电路图。在阐述IRF840功率MOSFET的开关特性的基础上,设计了吸收回路。最后结合直流斩波调速技术,设计了基于TMS320LF2407 DSP的直流电动机全数字闭环调速系统,给出了实验结果。关键词:TLP250;IRF840 MOSFET;吸收回路;直流斩波;DSP引言---功率集成电路驱动模块是微电子技术和电力电子技术相结合的产物,其基本功能是使动力和信息合一,成为机和电的关键接口。快速电力电子器件MOSFET的出现,为斩波频率的提高创造了条件,提高斩波频率

上一篇: 数据结构 - 散列 Hash 摘要
下一篇: 算法-排序-归并排序(MergeSort)分析
winnerbao
博客等级 码龄24年 8粉丝 36原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值