第7章_快速排序
第七章_排序

本章纲要
1.排序基本概念 1.排序基本概念 2.三种 三种O 2.三种O(n2)的简单排序 3.希尔 shell) 希尔( 3.希尔(shell)排序 4.堆排序 4.堆排序 5.基于分治法的排序 5.基于分治法的排序 6.大型结构排序 6.大型结构排序 7.桶式排序 7.桶式排序 8.外部排序 8.外部排序
2
1.排序基本概念 1.排序基本概念
定义: 定义:
设有记录序列: 设有记录序列:{ R1,R2, ….. ,Rn } 其相应 .. 的关键字序列为: 的关键字序列为:{ K1,K2, ….. ,Kn }; .. 若存在一种确定的关系: 若存在一种确定的关系: Kx <= Ky <= … <= Kz,则将记录序列 { R1,R2, ….. ,Rn } 排 则将记录序列 .. 成按该关键字有序的序列: 成按该关键字有序的序列:{ Rx,Ry, ….. .. Rz } 的操作,称之为排序。 的操作,称之为排序。 排序关系是任意的,如通常经常使用的小于、 排序关系是任意的,如通常经常使用的小于、 大于等关系或任意的关系。 大于等关系或任意的关系。
直接插入排序 二分法插入排序
冒泡排序(Bubble 冒泡排序(Bubble Sort) 选择排序 (Selection Sort)
5
2.三种O 2.三种O(n2)的简单排序 三种
直接插入排序 算法思想: 算法思想:
逐个处理待排序的记录, 逐个处理待排序的记录,每个新记录都要与 前面那些已排好序的记录进行比较, 前面那些已排好序的记录进行比较,然后插 入到适当的位置。 入到适当的位置。
32
3.希尔(shell) 3.希尔(shell)排序 希尔
继承插入排序优点
数据结构智慧树知到答案章节测试2023年哈尔滨商业大学

第一章测试1.数据结构的基本任务是()。
A:数据结构的评价与选择B:数据结构的设计与实现C:数据结构的运算实现D:逻辑结构和存储结构的设计答案:B2.计算算法的时间复杂度是属于一种()。
A:事前分析估算的方法B:事后分析估算的方法C:事后统计的方法D:事前统计的方法答案:A3.可以用()定义一个完整的数据结构。
A:数据元素B:数据关系C:抽象数据类型D:数据对象答案:C4.数据的逻辑关系是指数据元素的()。
A:存储方式B:数据项C:关联D:结构答案:C5.算法的计算量的大小称为计算的()。
A:效率B:复杂性C:实现性D:难度答案:B6.算法的时间复杂度取决于()。
A:问题的规模B:问题的规模和待处理数据的初态C:待处理数据的初态D:都不是答案:B7.数据元素是数据的最小单位。
()A:对B:错答案:B8.数据结构是带有结构的数据元素的结合。
()A:错B:对答案:B9.算法和程序没有区别,所以在数据结构中二者是通用的。
()A:错B:对答案:A10.数据结构的抽象操作的定义与具体实现有关。
()A:对B:错答案:B第二章测试1.下述哪一条是顺序存储结构的优点?()。
A:存储密度大B:删除运算方便C:插入运算方便D:可方便地用于各种逻辑结构的存储表示答案:A2.下面关于线性表的叙述中,错误的是哪一个?()。
A:线性表采用链接存储,便于插入和删除操作B:线性表采用顺序存储,必须占用一片连续的存储单元C:线性表采用链接存储,不必占用一片连续的存储单元D:线性表采用顺序存储,便于进行插入和删除操作答案:D3.线性表是具有n个()的有限序列(n>0)。
A:数据项B:表元素C:数据元素D:字符答案:C4.若某线性表最常用的操作是存取任一指定序号的元素和在最后进行插入和删除运算,则利用()存储方式最节省时间。
A:顺序表B:双链表C:带头结点的双循环链表D:单循环链表答案:A5.某线性表中最常用的操作是在最后一个元素之后插入一个元素和删除第一个元素,则采用()存储方式最节省运算时间。
第7章 软件理论基础

二、数据模型
⒈数据模型概述 ①数据模型:是客观世界对象及其联系的数据抽象和描述。
②按不同的应用层次分成三种类型: 概念数据模型(概念模型) 逻辑数据模型(数据模型) 物理数据模型(物理模型)
⒉E-R模型 P242 该模型将客观世界的要求描述成实体、属性、联系以及它 们之间的联系,并用图表示出来。 ①实体:指客观存在并且可以相互区别的事物。 实体集:具有共同性质的同类实体组成的集合。 用矩形表示实体集。 ②属性:实体所固有的特征和特性。 用椭圆形表示属性。 ③联系:实体之间的对应关系。 一对一(1︰1) 班级—正班长 一对多(1︰m) 宿舍—学生 多对多(m︰n) 学生—课程
三、线性表
由n个数据元素组成的有限序列,是一种典型的线 性结构。如由26个大写英文字母组成的字母表 (A ,B ,C ,· · · ,X ,Y ,Z)就是一个线性表。 ⒈满足下面三个特点:
在非空的线性表中,有且仅有一个开始结点,它没 有直接前件,而仅有一个直接后件。
有且仅有一个终结点,它没有直接后件,而仅有一 个直接前件。 其余的内部结点都有且仅有一个直接前件和一个直 接后件。
出列 a0 front a1 a2 · · · ai · · · an-1 入列
rear
循环队列:将顺序队列的存储区假想为一个环状的 空间,使顺序队列的整个数组空间变为首尾相接的 队列。
四、树
⒈树是一种十分重要的非线性结构。在这种结构中,所有数据 元素之间的关系具有明显的层次特性。
⒉树结构的基本术语 根结点、叶子结点、父结点、子结点、子树 结点的度:一个结点拥有的后件个数,称为该结点的度。
20084001 20084218
李明 王新
男 男 女
第7章_随机化算法

第7章_随机化算法随机化算法是一类基于随机数生成的算法,它的主要思想是通过引入随机性来改善算法的效率、正确性或可伸缩性。
在计算机科学中,随机化算法被广泛应用于各个领域,如优化问题、图论、排序等。
本文将介绍随机化算法的概念、应用以及一些常见的随机化算法。
一、概念随机化算法是一种利用随机数生成器的算法,通过引入随机性来改善算法的性能表现。
随机化算法的核心思想是使用随机数来决定算法的一些操作,使算法具有更好的平均性能或概率分布。
随机化算法有两个主要的特点:1.随机性:随机化算法依赖于随机数生成器产生的随机数,使用这些随机数来决定算法的一些操作。
2.概率分布:随机化算法通常具有其中一种概率分布特性,即算法的输出结果在一定概率上是正确的。
二、应用随机化算法在实际应用中有广泛的用途,主要包括以下几个方面:1.优化问题:对于一些优化问题,随机化算法可以提供一个近似解。
常见的例子有旅行商问题、背包问题等。
2.图论:在图论中,随机化算法可以用于生成随机图、图的遍历等问题。
3.排序:随机化算法可以用于改进排序算法的时间复杂度。
例如,快速排序算法就是一种经典的随机化排序算法。
4.模拟:在模拟领域,随机化算法可以用于生成随机事件,如蒙特卡洛模拟法。
1.快速排序算法:快速排序是一种基于分治思想的排序算法,它通过随机地选择一个元素作为基准,将数组分成左右两部分,然后对左右两部分分别进行快速排序。
2.蒙特卡洛模拟法:蒙特卡洛模拟法是一种通过随机采样来估计数学问题的方法。
它通过生成大量随机数,并利用这些随机数的统计性质来得出数学问题的近似解。
3.随机化算法在图论中的应用:在图论中,随机化算法可以用于生成随机图、图的遍历等问题。
例如,随机化算法可以用于生成连通图,即图中任意两个顶点之间存在至少一条路径。
4. Metropolis-Hastings算法:Metropolis-Hastings算法是一种用于模拟复杂概率分布的随机化算法。
排序与分类汇总教案

排序与分类汇总教案第一章:排序的概念与重要性1.1 排序的定义与目的1.2 排序在不同领域的应用1.3 排序的常用方法与算法1.4 排序在数据处理与分析中的重要性第二章:基本排序算法介绍2.1 冒泡排序算法2.2 选择排序算法2.3 插入排序算法2.4 快速排序算法2.5 归并排序算法第三章:算法的效率与优化3.1 排序算法的时间复杂度分析3.2 常见排序算法的比较与选择3.3 排序算法的空间复杂度分析3.4 排序算法的优化与改进第四章:分类与分类汇总的概念4.1 分类的定义与目的4.2 分类的方法与技术4.3 分类汇总的定义与目的4.4 分类汇总的方法与技术第五章:常见分类汇总方法介绍5.1 频数汇总与频率汇总5.2 平均值汇总与中位数汇总5.3 最大值与最小值汇总5.4 标准差与方差汇总5.5 堆积汇总与分层汇总第六章:实际案例中的排序应用6.1 数据预处理与排序6.2 排序在数据挖掘与推荐系统中的应用6.3 排序在信息检索与搜索引擎中的应用6.4 排序在图像处理与计算机视觉中的应用第七章:排序算法的选择与实现7.1 不同数据类型与排序算法的匹配7.2 排序算法的C/C++实现7.3 排序算法的Python实现7.4 排序算法的Java实现第八章:分类与分类汇总的实践操作8.1 数据预处理与分类8.2 分类汇总的基本操作8.3 使用Excel进行分类汇总8.4 使用Python的Pandas库进行分类汇总第九章:高级分类汇总技术9.1 聚类分析与分类9.2 决策树与随机森林分类9.3 支持向量机与神经网络分类9.4 集成学习方法在分类中的应用第十章:案例分析与实战演练10.1 综合案例分析:电商平台用户行为分析10.2 实战演练:社交媒体数据排序与分类汇总10.3 实战演练:金融行业数据排序与分类汇总10.4 实战演练:医疗健康数据排序与分类汇总重点和难点解析一、排序的概念与重要性重点:排序算法的选择与应用、排序在数据处理与分析中的重要性难点:排序算法的选择与优化二、基本排序算法介绍重点:冒泡排序算法、选择排序算法、插入排序算法、快速排序算法、归并排序算法难点:排序算法的实现与优化三、算法的效率与优化重点:排序算法的时间复杂度分析、常见排序算法的比较与选择难点:排序算法的空间复杂度分析、排序算法的优化与改进四、分类与分类汇总的概念重点:分类的定义与目的、分类汇总的定义与目的难点:分类与分类汇总的方法与技术五、常见分类汇总方法介绍重点:频数汇总与频率汇总、平均值汇总与中位数汇总、最大值与最小值汇总、标准差与方差汇总、堆积汇总与分层汇总难点:分类汇总方法的适用场景与选择六、实际案例中的排序应用重点:数据预处理与排序、排序在数据挖掘与推荐系统中的应用难点:排序算法在不同领域的应用与优化七、排序算法的选择与实现重点:不同数据类型与排序算法的匹配、排序算法的实现难点:排序算法的选择与实现八、分类与分类汇总的实践操作重点:数据预处理与分类、分类汇总的基本操作难点:使用Excel进行分类汇总、使用Python的Pandas库进行分类汇总九、高级分类汇总技术重点:聚类分析与分类、决策树与随机森林分类、支持向量机与神经网络分类难点:集成学习方法在分类中的应用十、案例分析与实战演练重点:综合案例分析、实战演练难点:实战演练中遇到的问题与解决方法本教案全面介绍了排序与分类汇总的概念、算法、应用和实践。
第7章 排序 习题参考答案

习题七参考答案一、选择题1.内部排序算法的稳定性是指( D )。
A.该排序算法不允许有相同的关键字记录B.该排序算法允许有相同的关键字记录C.平均时间为0(n log n)的排序方法D.以上都不对2.下面给出的四种排序算法中,( B )是不稳定的排序。
A.插入排序B.堆排序C.二路归并排序D.冒泡排序3. 在下列排序算法中,哪一种算法的时间复杂度与初始排序序列无关(D )。
A.直接插入排序B.冒泡排序C.快速排序D.直接选择排序4.关键字序列(8,9,10,4,5,6,20,1,2)只能是下列排序算法中( C )的两趟排序后的结果。
A.选择排序 B.冒泡排序 C.插入排序 D.堆排序5.下列排序方法中,( D )所需的辅助空间最大。
A.选择排序B.希尔排序C.快速排序D.归并排序6.一组记录的关键字为(46,79,56,38,40,84),则利用快速排序的方法,以第一个记录为支点得到的一次划分结果为(C )。
A.(38,40,46,56,79,84) B.(40,38,46,79,56,84)C.(40,38,46,56,79,84) D.(40,38,46,84,56,79)7.在对一组关键字序列{70,55,100,15,33,65,50,40,95},进行直接插入排序时,把65插入,需要比较( A )次。
A. 2B. 4C. 6D. 88.从待排序的序列中选出关键字值最大的记录放到有序序列中,该排序方法称为( B )。
A. 希尔排序B. 直接选择排序C. 冒泡排序D. 快速排序9.当待排序序列基本有序时,以下排序方法中,( B )最不利于其优势的发挥。
A. 直接选择排序B. 快速排序C.冒泡排序D.直接插入排序10.在待排序序列局部有序时,效率最高的排序算法是( B )。
A. 直接选择排序B. 直接插入排序C. 快速排序D.归并排序二、填空题1.执行排序操作时,根据使用的存储器可将排序算法分为内排序和外排序。
2016年考研核心题型【数据结构部分】【第7章 排序】

温馨提示:快速排序主要考查两点:1、快速排序算法的特点;2、快速排序算法实现; 3、快速排序的过程或者一趟排序的结果。本考点历年考查很多,是复习的重点,请同学们 务必掌握。
接插入排序每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍
然有序。
折半插入排序是对直接插入排序算法的一种改进。由于前半部分为已排好序的数列,
这样我们可以不用按顺序依次寻找插入点,而是采用折半查找的方法来加快寻找插入点的
速度。折半查找的方法来寻找插入位置,可以减少比较次数。但不影响排序的趟数(仍然
本题只剩下希尔排序了,事实上,本题是利用增量为 d=5、3、1 来对关键字{50 , 26 , 38 , 80 , 70 , 90 , 8 , 30 , 40 , 20 }进行希尔排序。其排序过程如图 7.2 所示。
我方慎重声明,各盈利机构若采用我方资料,必追究法律责任
102
2016 年考研核心考点命题思路解密 数据结构 梦享团队主编
1. 对一待排序序列分别进行折半插入排序和直接插入排序,两者之间可能的不同之处是
(
)。
A. 排序的总趟数
B. 元素的移动次数
C. 使用辅助空间的数量
D. 元素之间的比较次数
【2012 年统考——第 11 题】
【考查内容】直接插入排序和折半插入排序的区别。
【解析】所谓排序算法过程,就是不断的依次将元素插入前面已排好序的序列中。直
一趟冒泡排序结束。
整个排序过程如下图所示。
其过程如图 7.1 所示。
50 40 95 20 15 70 60 45 80
50>40,50和40交换
40 50 95 20 15 70 60 45 80
第7章 排序

第 七 章 排 序
上 一 页
下 一 页
返 回
第7章 排序 排序是程序设计中的常用算法,它可以提高查 例如: 对关键字值为:5,3,8,3,6,6的记录排序。 找效率、提高计算机的工作效率。因此,排序在各 若排序后的序列为:3,3,5,6,6,8,其 领域有着广泛的应用。 相同关键字值的元素位置依然是3在3前,6在6前, 7.1 排序的基本概念 与排序前保持一致,则表示这种排序法是稳定的; 1、排序:将数据元素(或记录)的任意序列,通过 若排序后的序列为:3,3,5,6,6,8,则 表示这种排序法是不稳定的。 某些方法重新排列成一个按关键字有序(递增或递 减)的序列的过程称为排序。 2、排序过程中的两种基本操作 ①比较两个关键字值的大小; ②根据比较结果,移动记录的位置。 3、排序的稳定性:对于关键字值相同的数据元素经 过某种方法排序后,若数据元素的位置关系,排序 前与排序后保持一致,称此排序方法是稳定的;反 2 之,则称为不稳定的。
VC++
算 法 演 示
第 七 章 排 序
上 一 页
下 一 页
返 回
直接插入排序的排序过程 直接插入排序的排序过程: 直接插入排序的排序算法: 设有n个数据已存放到数组R[1…n]中。 假定有原始序列:38,65,49,97,76,13,27,存放在一 void InsertSort(SeqList R) ①若R[i].key<R[i-1].key 则R[i]=>R[0],i-1=>j; 个长度为8的数组R中。 { int i,j; ②若R[0].key<R[j].key 则R[j]后移R[j]=>R[j+1],j--; i R[0] R[1] R[2] R[3] R[4] R[5] R[6] R[7] for(i=2;i<=n;i++) //依次插入R[2],R[3],…,R[n] ③重复执行②直到R[0].key≥R[j].key,即将R[i]要插 38 65 49 97 76 13 27 {if (R[i].key<R[i-1].key) 入的位置R[j+1]空出; 第一趟R[0]=R[i];38 //设置监视哨 65 { 2 ④R[0]=>R[j+1],即将R[i]插入到正确的位置; 第二趟j=i-1;49 38 49 3 ⑤重复执行以上各步。 65 第三趟while(R[0].key<R[j].key) 97 4 49 38 49 65 //查找R[i]的位置 •说明:以上排序过程共进行n-1趟。 { 5 76 38 49 65 76 第四趟 R[j+1]=R[j]; //向后移动记录 97 直接插入排序的排序算法 第五趟 j- -; 13 13 38 6 49 65 76 97 •说明:①监视哨R[0]的作用是:在进入确定插入位 } 第六趟 7 27 13 27 38 49 65 76 97 置的循环之前,保存了插入值R[i]的副本,避免因记 R[j+1]=R[0]; //插入R[i] 录的移动而丢失R[i]中的内容;使内循环总能够结束, } 以免循环过程中数组下标越界。 } ②时间复杂度为O(n2),辅助空间为O(1); } ③直接插入排序是稳定的排序方法; ④该方法最适合待排序关键字基本有序的序列。 4
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
10
快速排序说明
11
循环不变式在终止阶段
终止:当终止时,j=r。
数组中的每个元素都在循环不变式所描述的 三个集合的某一个之中,亦即,我们已将数 组中的所有元素划分成了三个集合:
这个递归式对应的递归树如下图所示:
17
平衡的划分
18
平衡的划分
树的每一层都有代价cn,直到在深度log10n=Θ (lgn)处达到边界条件, 以后各层代价至多为 cn。
递归于深度log10/9n=Θ (lgn)处结束。 快速排序的总时间代价为T(n)=Θ (nlogn),从 渐进意义上看就和划分是在中间进行的一样。
4
快速排序程序
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)
5
数组划分程序
PARTITION(A,p,r) 1 x←A[r] 2 i←p-1 3 for j←p to r-1 4 do if A[j]≤x then i ←i+1 5 exchange A[i]←→A[j] 6 7 exchange A[i+1]←→A[r] 8 return i+1
为常数。将归纳假设代入上式,得到:
2
0 q n 1 2
2
0 q n 1
2
因为在[0,n-1]上q2+(n-q-1)2关于q递减,所以当 q=0时q2+(n-q-1)2有最大值n2-2n+1。
30
7.4 最坏情况分析
于是有:
T (n) cn2 2c(2n 1) (n)) cn2
在一个差的划分后接一个好的划分后,产生出 三个子表,大小各为0,(n-1)/2-1和(n-1)/2,代 价共为Θ(n)+Θ(n-1) =Θ (n)。这与图(b)中的情 况差不多。该图中一层划分就产生出大小为(n1)/2的两个子表,代价为n=Θ (n)。这种划分差 不多是完全对称的,比9:1的划分要好。 从直觉上看,差的划分的代价Θ (n)可被吸收到 好的划分的代价Θ (n)中去,结果是一个好的划 分。这样,当好、差划分交替分布划分都是好 的一样:仍是Θ (nlogn),但Θ记号中隐含的常 数因子要略大一些。关于平均情况的严格分析 将在后文给出。
未被包含进这三种情况,它们的元素和x 也没有明确的关系
8
循环不变式的正确性
我们得证明循环不变式在算法执行的各个 时期都是正确的。 初始化:
在循环的第一轮迭代开始之前,有i=p-1和 j=p。 在p和i之间没有值,在i+1和j-1之间也没有 值,循环不变式的头两个条件显然满足。 第1行中的复制操作满足第3个条件。
快速排序
本章内容
快速排序的描述 快速排序的性能 快速排序的随机化版本 快速排序分析
2
7.1快速排序的描述
快速排序是一种排序算法,对包含n个数 的输入数组,最坏情况运行时间为 。 n
2
虽然最坏情况运行时间比较差,但快速排 序通常是用于排序的最佳的使用选择,这 是因为其平均性能相当好:期望的运行时 间为Θ(nlgn),且Θ(nlgn)记号中隐含的常 数因子很小。 快速排序还能就地排序。
3
快速排序的步骤
快速排序分三个步骤
分解:数组A[p..r]被划分成两个子数组A[p..q1]和A[q+1..r],使得A[p..q-1]中的每个元素都 小于等于A(q),而且,小于A[q+1..r]中的元 素。下标q也在这个划分过程中进行计算。 解决:通过递归调用快速排序,对子数组 A[p..q-1]和A[q+1..r]排序。 合并:因为两个子数组是就地排序的,将它 们合并不需要操作,整个数组A[p..r]已排序
当我们对一个随机的输入数组应用快速排序 时,要想在每一层上都有同样的划分是不太可 能的。我们所能期望的是某些划分较对称,另 一些则很不对称。 事实上,我们可以证明,如果选择L[p..r]的第一 个元素作为支点元素,Partition所产生的划分 80%以上都比9:1更对称,而另20%则比9:1差。
21
一个集合中包含了小于等于x的元素 第二个集合中包含了大于x的元素 还有一个只包含了x的集合
12
PARTITION运行时间
PARTITION在子数组A[p…r] 上的执行时 间为Θ(n), n = r - p + 1。
13
7.2 快速排序的性能
快速排序的运行时间与划分是否对称有 关,我们分别就以下三种情况进行讨论
6
快速排序图示
下图是8元素数组上运行PARTITION过程的示例
7
循环不变式
在第3-6行的每次循环之前,对于下标k
若p ≤ k ≤ i, 则A[k] ≤ x. 若i + 1 ≤ k ≤ j - 1, 则 A[k] > x. 若k = r, 则 A[k] = x. 下图说明了这种情况 。j与r-1之间的下标并
28
7.4 快速排序分析和最坏情 况分析
快速排序分析 在前文我们从直觉上分析了快速排序在平均情 况下的性能为Θ (nlogn),我们将在下面定量地 分析快速排序法的性能。 最坏情况分析: 前面从直觉上可以判断出最坏情况发生在每次 划分过程产生的两个区间分别包含n-1个元素和 1个元素的时候(设输入的表有n个元素)。下面我 们来证明这种每次划分过程产生的两个区间分 别包含n-1个元素和1个元素的情况就是最坏情 况
32
7.4 平均情况分析
引理7.1 设当QUICKSORT在一个包含n个元素 的数组上运行时,PARTITION在第四行所做比 较次数为X。那么,QUICKSORT的运行时间为 O(n+X) 证明:根据上面的讨论,对PARTITION的调用 共有n次,每一次调用都需做固定量的工作,再 执行若干次for循环。在for循环的每一轮迭代 中,都需要执行第4行。
22
快速排序递归树划分的两 种情况
下图表示了递归树的连续两层上的划分情况
在根节点处,划分的代价为n,划分出来的两个子表 的大小为n-1和1,即最坏情况。 在根的下一层,大小为n-1的子表按最佳情况划分成 大小各为(n-1)/2的两个子表。这儿我们假设含1个元 素的子表的边界条件代价为1。
23
平衡情况性能的直觉分析
19
平衡的划分
事实上,即使是99:1的划分时间代价也为 Θ (nlogn)。 任何一种按常数比例进行划分所产生的递归树 的深度都为Θ (lgn),其中每一层的代价为 O(n),因而不管常数比例是什么,总的运行时 间都为Θ (nlogn),只不过其中隐含的常数因子 有所不同。
20
平衡情况性能的直觉分析
15
最佳情况划分
在PARTITION可能做的最平衡的划分 中,得到的两个子问题的大小都不大可能 大于n/2。
在这种情况下,快速排序运行的速度要快 的多。这时,表达其运行时间的递归式为 T(n)≤2T(n/2)+Θ(n) 根据主定理,该递归式的解为 T(n)=O(nlgn)。
16
平衡的划分
假设划分过程总是产生9:1的划分,乍一 看这种划分很不平衡,这时快速排序的递 归式为 T (n) T (9n / 10) T (n / 10) cn
只要c足够大,上面的第二个小于等于号就可以 成立。这样快速排序最坏情况为Θ(n2)
31
7.4 平均情况分析
QUICKSORT的运行时间是由花在过程 PARTITION上的时间所决定的。 每当PARTITION过程被调用时,就要选出一个 主元素。于是最多调用这个过程n次 调用一次PARTITION件事与3~6行for循环次数 成正比,这个for循环每一轮迭代都要在第4行中 进行一次比较 只要知道第4行执行次数,就可以知道 QUICKSORT中for循环所化时间
27
随机化快排
RANDOMIZED-PARTITION(A,p,r) 1 i←RANDOM(p,r) 2 exchange A[r]←→A[i] 3 return PARTITION(A,p,r) 新的快速排序过程调用RANDOMIZEDPARTITION RANDOMIZED-PARTITION(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)
29
7.4 最坏情况分析
设T(n)是过程Quick_Sort作用于规模为n的输入 上的最坏情况的时间,则
T ( n ) m a x ( T ( q ) T ( n q 1) ( n ) ) ( 7 .1)
0qn1
其中1≤q≤n-1,因为PARTITION过程产生两个区域, 每个大小至多为n-1。我们假设T(n)≤cn2 ,其中c
24
7.3 快速排序的随机化版本 前面分析中,我们假定输入数据的所有排 列都是等可能的。但在实际应用中,这个 假设就不会总是成立。 解决的方法是,利用随机化策略,能够克 服分布的等可能性假设所带来的问题。
25
7.3 快速排序的随机化版本
快速排序的随机化版本有一个和其他随机化算 法一样的有趣性质:
最坏情况划分 最佳情况划分 平衡的划分
14
最坏情况划分
快速排序的最坏情况划分行为发生在划分过程 产生的两个区域分别包含n-1个元素和1个元素 的时候。 假设算法的每一次递归调用中都出现了这种不 对称划分。划分的时间代价为Θ(n)。