第2章-分治策略3快速排序教学课件_第1页
第2章-分治策略3快速排序教学课件_第2页
第2章-分治策略3快速排序教学课件_第3页
第2章-分治策略3快速排序教学课件_第4页
第2章-分治策略3快速排序教学课件_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

2.5快速排序问题

QuickSort由著名计算机科学家霍尔(C.A.R.Hoare)给出。把原序列分成两个子问题,在被分成的两个子问题以后不再需要归并。被分成的两个子问题必须满足一子问题中的所有元素都小于或等于另一子问题的任何一个元素。2020/12/121QuickSortSelectapivot(partitioningelement)RearrangethelistsothatalltheelementsinthepositionsbeforethepivotaresmallerthanorequaltothepivotandthoseafterthepivotarelargerthanthepivotExchangethepivotwiththelastelementinthefirst(i.e.,≤sublist)–thepivotisnowinitsfinalpositionSortthetwosublists2020/12/1222.5快速排序问题基本策略是:将数组A[1:n]分解成两个子数组B[1:p]和B[p+1:n],使得B[1:p]中的元素均不大于B[p+1:n]中的元素,然后分别对这里两个数组中的元素进行排序(非降的),最后再把两个排好序的数组接起来即可。pA[i]≤pA[i]>p2020/12/123选取A的某个元素t=A(s),然后将其他元素重新排列,使A(1:n)中所有在t以前出现的元素都小于或等于t,而在t之后出现的元素都大于或等于t。A(1)A(2)…A(s-1)A(s)A(s+1)…A(n)t划分元素…A(n)A(k)tA(j)…A(2)A(1)经过一次划分后每个元素都小于或等于t每个元素都大于或等于t2.5快速排序问题2020/12/124Thepartitionalgorithm2020/12/125算法步骤分解(Divide):以a[p]为基准元素将a[p:r]划分成3段a[p:q-1],a[q]和a[q+1:r],使得a[p:q-1]中任何一个小于等于a[q],下标q在划分过程中确定。递归求解(conquer):通过递归调用快速排序算法分别对a[p:q-1]和a[q+1:r]进行排序。合并(Merge):由于对a[p:q-1]和a[q+1:r]的排序是就地进行的,所以在a[p:q-1]和a[q+1:r]都已排好的序后步需执行任何计算a[p:r]就已排好序。2.5快速排序问题2020/12/126快速排序template<classType>voidQuickSort(Typea[],intp,intr){if(p<r){intq=Partition(a,p,r);QuickSort(a,p,q-1);//对左半段排序QuickSort(a,q+1,r);//对右半段排序}}a的起始位置a的终止位置Partition函数负责将a进行一次分割,返回分割元素的位置快速排序问题2.5快速排序问题2020/12/127划分过程Partition的过程中,首先要选择一个元素,根据其值划分数组。称该元素为中轴。选择中轴有许多不同的策略,我们使用最简单的策略,选择第一个元素:s=a[p]。快速排序问题2.5快速排序问题2020/12/128划分举例(1)(2)(3)(4)(5)(6)(7)(8)(9)(10)ip657075808560555045+∞29654575808560555070+∞38654550808560557570+∞47654550558560807570+∞56654550556085807570+∞65604550556585807570+∞快速排序问题2.5快速排序问题Figure2-12020/12/129划分的过程使用一种两次扫描子数组的方法:一次是从左到右,另一次是从右到左,每次都把子数组的元素和中轴进行比较。从左到右的扫描从第二个元素开始,希望小于中轴的元素位于子数组的第一部分,扫描会忽略小于中轴的元素,直到遇到第一个大于等于中轴的元素才会停止。从右到左的扫描从最后一个元素开始,因为我们希望大于中轴的元素位于子数组的第二部分,扫描会忽略大于中轴的元素,直到遇到第一个小于等于中轴的元素才会停止。快速排序问题2.5快速排序问题2020/12/1210P全部<=p>=p·····<=p全部>=pij全部>=p=p全部<=pPi=j全部>=p>=p<=p全部<=pPij快速排序问题如果扫描指针i和j不相交,i<j,简单交换A[i]和A[j],再分别对i加1,j减1,然后继续扫描如果扫描指针i和j相交,i>j,把中轴和A[j]交换,得到该数组的一个分区。如果扫描指针i指向同一元素,i=j,被指向元素的值一定等于p。2.5快速排序问题2020/12/1211划分程序template<classType>intPartition(Typea[],intp,intr){inti=

,j=

;Typex=

;while(true){while(a[++i]<x);while(a[--j]>x);if(

)break;Swap(a[i],a[j]);}a[p]=

;a[j]=

;returnj;}快速排序问题pr+1a[p]i>=ja[j]x左侧扫描指针起始右侧扫描指针起始中轴元素移动左侧扫描指针移动右侧扫描指针2.5快速排序问题该算法是否有问题?2020/12/1212快速排序问题例:排列5,3,1,9,8,2,4,701234567

ij53198247

ij53198247

ij53148297

ij53148297

ij53142897

ji53142897

2

3145897

ij2

314ij2

314ij2

134ji2

1341

2341ij

34ji

344ij8

97ji8

79789792.5快速排序问题2020/12/1213问题:扫描停止的时候i和j有几种关系,每种代表哪种情况?下标i和j会不会超出a的下标界?该排序算法是否稳定?快速排序问题2.5快速排序问题2020/12/1214EfficiencyofQuickSortBestcase:splitinthemiddle—Θ(nlogn)Worstcase:sortedarray!—Θ(n2)Averagecase:randomarrays—Θ(nlogn)Improvements:betterpivotselection:medianofthreepartitioningavoidsworstcaseinsortedfilesswitchtoinsertionsortonsmallsubfileseliminationofrecursionthesecombineto20-25%improvementConsideredthemethodofchoiceforinternalsortingforlargefiles(n≥10000)2020/12/1215算法分析最坏情况:划分的两个区域分别包含n-1个元素和1个元素,也就是已经排好序的数组。如果用A[0]作为中轴,从左到右的扫描会停在A[1]上,而从右到左的扫描会一直处理到A[0],导致分裂点出现在0这个位置,所以,在进行了n+1次比较之后建立了分区,并且将A[0]和它本身进行了交换以后,快速排序算法还会对严格递增的数组A[1···n-1]进行排序,对规模减小了的严格递增数组的排序会一直继续到最后一个子数组A[n-2···n-1],这种情况下,键值比较的总次数应该等于:(n+1)+n+…+3=O(n2)快速排序问题2.5快速排序问题2020/12/1216算法分析最坏情况:划分的两个区域分别包含n-1个元素和1个元素,如果每一步都出现这种情况,其复杂性T(n)

O(1)n≤1

T(n)=

T(n-1)+O(n)n>1解得:T(n)=O(n2)快速排序问题2.5快速排序问题2020/12/1217最好情况:每次划分所取的基准都恰好为中值,即每次划分都产生两个大小为n/2的区域,O(1)n≤1T(n)=2T(n/2)+O(n)n>1T(n)=O(nlogn)快速排序问题2.5快速排序问题2020/12/1218计数排序、冒泡排序、插入排序、选择排序、归并排序和快速排序的时间复杂性如下:算法最坏复杂性平均复杂性冒泡排序n2n2计数排序n2n2插入排序n2n2选择排序n2n2快速排序n2nlogn归并排序nlognnlogn快速排序问题2.5快速排序问题2020/12/12192.6线性时间选择

SelectioninLinearTime问题:已知n元数组A[1:n],试确定其中第k小的元素。如果k=1,就是找最小的元素,如果k=n,就是找最大的元素。2.6线性时间选择2020/12/1220利用快速分类思想解决这一问题根据PARTITION过程。如果划分元素v确定在A(j)的位置上,则有j-1个元素小于或等于A(j),且有n-j个元素大于或等于A(j)。2.6线性时间选择2020/12/1221假设在一次划分中,划分元素v处于第j个位置。如果k<j,则要找的第k小元素在新数组A[1:j-1]中,而且是A[1:j-1]的第k小元素;如果k=j,则划分元素v即是要找的第k小元素;如果k>j,则要找的第k小元素在新数组A[j+1:n]中,而且是A[j+1:n]的第k-j小元素。2.6线性时间选择2020/12/1222采用划分的选择算法

若k=j,则A(j)即是第k小元素;否则,若k<j,则第k小元素为A(1:j-1)中第k小元素;若k>j,则第k小元素为A(j+1:n)中第k-j小元素。A(1)A(2)…A(j-1)A(j)A(j+1)…A(n-1)A(n)V划分元素k<j时,第k小元素所在的集合K>j时,第k小元素所在的集合K=j时,第k小元素就是划分元素2.6线性时间选择2020/12/1223template<classType>TypeRandomizedSelect(Typea[],intp,intr,intk){if(p==r)returna[p];inti=RandomizedPartition(a,p,r);j=i-p+1;if(k<=j)returnRandomizedSelect(a,p,i,k);elsereturnRandomizedSelect(a,i+1,r,k-j);}2.6线性时间选择2020/12/1224例:4,1,10,9,7,12,8,2,15中寻找第5个最小元素,假设下标从1到9第一次调用Randomizedpartition(a,1,9)=3得到2149712810155>3,调用RandomizedSelect(a,4,9,2)第二次调用Randomizedpartition(a,4,9)=6得到21

4879

1210155<6,调用RandomizedSelect(a,4,6,2)第二次调用Randomizedpartition(a,4,6)=5得到21

478

9

1210152.6线性时间选择2020/12/1225算法复杂度:在最坏情况下,总是在最大元素处划分,算法RandomizedSelect需要O(n2)计算时间。但可以证明,算法RandomizedSelect可以在O(n)平均时间内找出n个输入元素中的第k小元素。2.6线性时间选择2020/12/1226如果能在线性时间内找到一个划分基准,使得按这个基准所划分出的2个子数组的长度都至少为原数组长度的ε倍(0<ε<1是某个正常数),那么就可以在最坏情况下用O(n)时间完成选择任务。例如,若ε=9/10,算法递归调用所产生的子数组的长度至少缩短1/10。所以,在最坏情况下,算法所需的计算时间T(n)满足递归式T(n)≤T(9n/10)+O(n)。由此可得T(n)=O(n)。2.6线性时间选择2020/12/1227将n个输入元素划分成n/5个组,每组5个元素,只可能有一个组不是5个元素。用任意一种排序算法,将每组中的元素排好序,并取出每组的中位数,共n/5个。递归调用select来找出这n/5个元素的中位数。如果n/5是偶数,就找它的2个中位数中较大的一个。以这个元素作为划分基准。设所有元素互不相同。在这种情况下,找出的基准x至少比3(n-5)/10个元素大,因为在每一组中有2个元素小于本组的中位数,而n/5个中位数中又有(n-5)/10个小于基准x。同理,基准x也至少比3(n-5)/10个元素小。而当n≥75时,3(n-5)/10≥n/4所以按此基准划分所得的2个子数组的长度都至少缩短1/4。2.6线性时间选择2020/12/1228privatestaticComparableselect(intp,intr,intk){

if(r-p<5){//用某个简单排序算法对数组a[p:r]排序;

bubbleSort(p,r);

returna[p+k-1];}//将a[p+5*i]至a[p+5*i+4]的第3小元素//与a[p+i]交换位置;//找中位数的中位数,r-p-4即上面所说的n-5

for(inti=0;i<=(r-p-4)/5;i++){ints=p+5*i,t=s+4;

for(intj=0;j<3;j++)bubble(s,t-j);MyMath.swap(a,p+i,s+2);}Comparablex=select(p,p+(r-p-4)/5,(r-p-4)/10);inti=partition(p,r,x),j=i-p+1;

if(k<=j)return

select(p,i,k);

elsereturnselect(i+1,r,k-j);}复杂度分析T(n)=O(n)上述算法将每一组的大小定为5,并选取75作为是否作递归调用的分界点。这2点保证了T(n)的递归式中2个自变量之和n/5+3n/4=19n/20=εn,0<ε<1。这是使T(n)=O(n)的关键之处。当然,除了5和75之外,还有其他选择。2.6线性时间选择2020/12/1229自学改进的线性时间选择作业教材P37页,2-152020/12/1230ExercisesUsingFigure

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论