排序算法汇总(图解加程序代码)_第1页
排序算法汇总(图解加程序代码)_第2页
排序算法汇总(图解加程序代码)_第3页
排序算法汇总(图解加程序代码)_第4页
排序算法汇总(图解加程序代码)_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

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

文档简介

1、排序算法汇总第1节排序及其基本概念一、基本概念1什么是排序排序是数据处理中经常使用的一种重要运算。设文件由n个记录Rl,R2,Rn组成,n个记录对应的关键字集合为Kl,K2,,Kn。所谓排序就是将这n个记录按关键字大小递增或递减重新排列。b5E2RGbCAP2稳定性当待排序记录的关键字均不相同时,排序结果是惟一的,否则排序结果不唯一。如果文件中关键字相同的记录经过某种排序方法进行排序之后,仍能保持它们在排序之前的相对次序,则称这种排序方法是稳定的;否则,称这种排序方法是不稳定的。plEanqFDPw3排序的方式由于文件大小不同使排序过程中涉及的存储器不同,可将排序分成内部排序和外部排序两类。整

2、个排序过程都在内存进行的排序,称为内部排序;反之,若排序过程中要进行数据的内、外存交换,则称之为外部排序。DXDiTa9E3d内排序适用于记录个数不是很多的小文件,而外排序则适用于记录个数太多,不能一次性放人内存的大文件。内排序是排序的基础,本讲主要介绍各种内部排序的方法。按策略划分内部排序方法可以分为五类:插入排序、选择排序、交换排序、归并排序和分配排序。二、排序算法分析1排序算法的基本操作几乎所有的排序都有两个基本的操作:1)关键字大小的比较。2)改变记录的位置。具体处理方式依赖于记录的存储形式,对于顺序型记录,一般移动记录本身,而链式存储的记录则通过改变指向记录的指针实现重定位。RTCr

3、pUDGiT为了简化描述,在下面的讲解中,我们只考虑记录的关键字,则其存储结构也简化为数组或链表。并约定排序结果为递增。5PCzVD7HxA2排序算法性能评价排序的算法很多,不同的算法有不同的优缺点,没有哪种算法在任何情况下都是最好的。评价一种排序算法好坏的标准主要有两条:jLBHrnAILg1)执行时间和所需的辅助空间,即时间复杂度和空间复杂度;2)算法本身的复杂程度,比如算法是否易读、是否易于实现。第2节插入排序插入排序的基本思想是:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的记录集中,使记录依然有序,直到所有待排序记录全部插入完成。xHAQX74J0X一、直接插入排序1直

4、接插入排序的思想否则,将Aj后移一个位置:Aj-Aj+1;继续执行否则,将Aj后移一个位置:Aj-Aj+1;继续执行假设待排序数据存放在数组Al.n中,则Al可看作是一个有序序列,让i从2开始,依次将Ai插入到有序序列Al.i-1中,An插入完毕则整个过程结束,Al.n成为有序序列。LDAYtRyKfE2排序过程示例用【】表示有序序列)待排序数据:【25】548542119727315。vari,j:integer。beginfori:=2tondobegina0:=ai。j:=i-1。whileaja0do决定运算次数和移动次数beginaj+1:=aj。j:=j-1。end。aj+1:=a

5、0。end。end。5算法分析1)稳定性:稳定n时,本组数s:=round(s/2。减fork:=1tosdo别排序begini:=k+s。whilei=ndo据排序结束begina0:=ai。j:=i-s。约定步长为Swhile(aja0and(j=kdobeginaj+s:=aj。j:=j-s。end。aj+s:=a0。i:=i+s。end。end。untils=1。end。5算法分析1)稳定性:不稳定2)时间复杂度:Shell排序的执行时间依赖于增量序列。如实例所示,选择增量系列为5-2-1的比较次数增量系列为5-3-2-1的比较次数。SixE2yXPq5在直接插入排序中,数据越趋向于有

6、序,比较和移动次数越少,Shell排序的目的则是增加这种有序趋势。虽然看起来重复次数较多,需要多次选择增量,但开始时,增量较大,分组较多,但由于各组的数据个数少,则比较次数累计值也小,当增量趋向1时,组内数据增多,而所有数据已经基本接近有序状态,因此,Shell的时间性能优于直接插入排序。6ewMyirQFL3)空间复杂度:仅需一个单元AO第3节交换排序交换排序的基本思想是:两两比较待排序的数据,发现两个数据的次序相反则进行交换,直到没有反序的数据为止。kavU42VRUs一、冒泡排序1冒泡排序的思想最多进行n-1趟排序,每趟排序时,从底部向上扫描,一旦发现两个相邻的元素不符合规则,则交换。我

7、们发现,第一趟排序后,最小值在Al,第二趟排序后,较小值在A2,第n-1趟排序完成后,所有元素完全按顺序排列。y6v3ALoS892排序过程示例待排序数据:5333195336382201939。vartemp,i,j:integer。change:boolean。fori:=1ton-1dobeginchange:=false。forj:=n-1downtoidoifajaj+1thenbeginchange:=true。temp:=aj。aj:=aj+1aj+1:=temp。end。ifnot(changethenexit。end。end。4算法分析1)稳定性:稳定2)时间复杂度:原始数据

8、正序,需一趟排序,比较次数n-l=O(n原始数据反序,需n-1趟排序,比较次数据位置的改变b6vSTnP一般情况下,虽然不一定需要n-1趟排序,但需要3次移动操作,因此,总时间复杂度高于直接插丿X,交换Ai与Aj,j-1。保证了XWAj.high继续执行、,直到i=jo这时,X恰好在Ai位置上。对序列Alow.i-1及Ai+1.high按照上述规律继续划分,直到序列为空。仔细分析算法,我们发现,在排序中,我们总是用基准X与另一数据交换,因此,一趟排序结束后,X就能确切定位其最终位置。sQsAEJkW5T3排序过程示例待排序数据:6767145229990548771X=67ij扫描jij交换5

9、467145229990678771扫描iij交换5467145229967908771j=i,结束ij第一趟排序后:5467145229967908771第二趟排序后:9291452546767718790第三趟排序后:9291452546767718790第四趟排序后:9142952546767718790第五趟排序后:91429525467677187904程序代码procedurequicksort(low,high:integer。vartemp,x,i,j:integer。beginiflowhighthenbeginx:=alow。i:=low。j:=high。whileijdo

10、beginwhile(jiand(aj二xdoj:二jT。j左移temp:=ai。ai:=aj。aj:=temp。i:=i-1。while(jiand(ai=xdoi:=i+1。i右移temp:=ai。ai:=aj。aj:=temp。j:=j-1。end。quicksort(low,i-1。quicksort(i+1,high。end。end。5算法分析1)稳定性:不稳定2)时间复杂度:每趟排序所需的比较次数为待排序区间的长度-1,排序趟数越多,占用时间越多。最坏情况:每次划分选取的基准恰好都是当前序列中的最小(或最大值,划分的结果Alow.iT为空区间或Ai+l.high是空区间,且非空区间

11、长度达到最大值。GMsIasNXkA这种情况下,必须进行n-1趟快速排序,第i次趟去见长度为n-i+1,总的比较次数达到最大值:n(n-l/2=0(n2TIrRGchYzg最好情况:每次划分所取的基准都是当前序列中的“中值”,划分后的两个新区间长度大致相等。共需lgn趟快速排序,总的关键字比较次数:O(nlgn7EqZcWLZNX基准的选择决定了算法性能。经常采用选取low和high之间一个随机位置作为基准的方式改善性能。vartemp,k,i,j:integer。beginfori:=1ton-1dobegink:=i。forj:=i+1tondoifajakthenk:=j。ifkithe

12、nbegina0:=ai。ai:=ak。ak:=a0end。end。end。3算法分析。堆的调整varj:integer。beginif2*i=sthen如果该结点为叶子,则不再继续调整begina0:=ai。j:=i。ifa2*ia0thenbegina0:=a2*i。j:=2*i。end。2MiJTy0dTTif(2*i+1=sand(a2*i+1a0thenbegina0:=a2*i+1。j:=2*i+1。end。获取最大值ifjithenbegineditheap(j,s。调整左右孩子editheap(j,s。调整左右孩子end。end。end。procedurebuildheap。堆

13、的建立vari,j:integer。beginfori:=ndiv2downto1do从后往前,依次调整begina0:=ai。j:=i。ifa2*ia0thenbegina0:=a2*i。j:=2*iend。gIiSpiue7Aif(2*i+1and(a2*i+1a0thenbegina0:=a2*i+1。j:=2*i+1。end。ifjithenbeginaj:=ai。ai:=a0。editheap(j,n。end。end。end。procedureheapsort(n:integer。堆排序vark,i,j:integer。beginbuildheap。fori:=ndownto2dob

14、egina0:=ai。ai:=a1。a1:=a0。editheap(1,i-1。end。end。5算法分析1)稳定性:不稳定。假定数据序列为1,1,已是大堆,经过排序后,结果为1,1。2)时间复杂度:堆排序的时间,主要由建立初始堆和反复调整堆这两部分的时间开销构成,它们均是通过调用editheap函数实现的。uEhOUlYfmh堆排序的最坏时间复杂度为O(nlgn。堆排序的平均性能较接近于最坏性能。由于建初始堆所需的比较次数较多,所以堆排序不适宜于记录数较少的文件。IAg9qLsgBX3)空间复杂度:0(1第5节归并排序归并排序是利用归并技术来进行排序。归并是指将若干个已排序的子文件合并成一个

15、有序的文件。一、两路归并算法1、算法基本思路设有两个有序ovarp1,p2,p3,j:integerobeginifmnthenh:=nop1:=lop2:=m+1op3:=lowhile(p1and(p2dobeginifap1mthenp3:=p3+1。p3:=p3+1。forj:=p2tohdobegincp3:=aj。end。BkeGuInkxIifp2hthenforj:=p1tomdobegincp3:=aj。end。PgdO0sRlMoforj:=ltohdoaj:=cj。end。end。二、归并排序归并排序有两种实现方法:自底向上和自顶向下。1自底向上的方法1)自底向上的基本思

16、想自底向上的基本思想是:第1趟归并排序时,将数列Al.n看作是n个长度为1的有序序列,将这些序列两两归并,若n为偶数,则得到n/2个长度为2的有序序列;若n为奇数,则最后一个子序列不参与归并。第2趟归并则是将第1趟归并所得到的有序序列两两归并。如此反复,直到最后得到一个长度为n的有序文件为止。3cdXwckml5上述的每次归并操作,均是将两个有序序列合并成一个有序序列,故称其为“二路归并排序”。类似地有k(k2路归并排序。h8c52W0ngM2)程序代码proceduremergesort。vari,s,k:integer。begins:=1。whilesndobegini:=1。repeat

17、merge(s*(i-1+1,s*i,s*(i+1。i:=i+2。untilin。s:=s*2。end。end。2自顶向下的方法采用分治法进行自顶向下的算法设计,形式更为简洁1)分治法的三个步骤设归并排序的当前区间是Al.h,分治法的三个步骤是:分解:将当前区间一分为二,即求分裂点m=(l+h/2求解:递归地对两个子区间Al.m和Am+l.h进行归并排序;组合:将已排序的两个子区间Al.m和Am+l.h归并为一个有序的区间Al.h。递归的终结条件:子区间长度为1一个数据组成的区间必然有序)。2)程序代码proceduremergesort(l,h:integer。varm:integer。beginifhlthenbeginm:=(h+ldiv2。mergesort(l,m。mergesort(m+1,h。merge(l,m,

温馨提示

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

最新文档

评论

0/150

提交评论