算法内部排序插入排序.ppt
- 文档编号:2123523
- 上传时间:2022-10-27
- 格式:PPT
- 页数:31
- 大小:1.27MB
算法内部排序插入排序.ppt
《算法内部排序插入排序.ppt》由会员分享,可在线阅读,更多相关《算法内部排序插入排序.ppt(31页珍藏版)》请在冰豆网上搜索。
-插入排序
(1)第9章内部排序9.1概述概述9.2插入排序插入排序9.3快速排序快速排序9.4选择排序选择排序9.5归并排序归并排序9.6基数排序基数排序9.7内部排序方法的比较内部排序方法的比较第9章内部排序21.直接插入排序直接插入排序(基于顺序查找)(基于顺序查找)3.表插入排序表插入排序(基于链表存储)(基于链表存储)2.折半插入排序折半插入排序(基于折半查找)(基于折半查找)4.希尔排序希尔排序(基于逐趟缩小增量)(基于逐趟缩小增量)99.2.2插入排序插入排序1.直接插入排序直接插入排序利用利用“顺序查找顺序查找”实现实现“在在R1.i-1R1.i-1中中查找查找RiRi的插入位置的插入位置”99.2.2插入排序插入排序插入过程分为两步插入过程分为两步:
在已排好序的表中查找插入位置;在已排好序的表中查找插入位置;插入元素。
插入元素。
不同的插入算法的区别在于第一步的不同不同的插入算法的区别在于第一步的不同从从Ri-1Ri-1起向前进行顺序查找,起向前进行顺序查找,监视哨设置在监视哨设置在R0R0;R0=Ri;/R0=Ri;/设置设置“哨兵哨兵”循环结束表明循环结束表明RiRi的插入位置为的插入位置为j+1j+1对于在查找过程中找到的那些关对于在查找过程中找到的那些关键字不小于键字不小于i.keyi.key的记录,并在查找的同时实现记录向后移动;的记录,并在查找的同时实现记录向后移动;Rj+1=RjRj+1=RjR0R0j+1j+1RiRifor(j=i-1;R0.keyRj.key;-j);for(j=i-1;R0.keyRj.key;-j);j=i-1j=i-1插入位置插入位置99.2.2.1.1直接插入排序直接插入排序voidInsertionSort(SqList&L)/对顺序表对顺序表L作直接插入排序。
作直接插入排序。
for(i=2;i=L.length;+i)if(L.ri.keyL.ri-1.key)/InsertSortL.r0=L.ri;/复制为监视哨复制为监视哨for(j=i-1;L.r0.keyL.ri-1.keyi=3L.ri.keyL.ri-1.keyi=4L.r0=L.ri;25*46jj+125*i=5L.ri.keyL.ri-1.key114625*252011i=6L.ri.keyL.ri-1.keyL.r0=L.ri;/复制为监视哨复制为监视哨for(j=i-1;L.r0.keyL.rj.key;-j)L.rj+1=L.rj;/记录后移记录后移L.rj+1=L.r0;/插入到正确位置插入到正确位置064625*2520110606j+1完成完成8p排序效率分析排序效率分析
(1)时间复杂度:
时间复杂度:
关键字的比较次数和记录移动次数。
关键字的比较次数和记录移动次数。
(2)空间复杂度:
空间复杂度:
执行算法所需的附加存储空间。
执行算法所需的附加存储空间。
(3)稳定算法和不稳定算法稳定算法和不稳定算法99.2.2.1.1直接插入排序直接插入排序例例11:
设有关键字序列为:
设有关键字序列为:
7,4,3,29,13,6,直接,直接插入排序的过程如图所示:
插入排序的过程如图所示:
初始记录的关键字:
初始记录的关键字:
74329136第一趟排序:
第一趟排序:
47329136第二趟排序:
第二趟排序:
34729136第三趟排序:
第三趟排序:
34729136第四趟排序:
第四趟排序:
34713296第五趟排序:
第五趟排序:
34671329图图9-1直接插入排序的过程直接插入排序的过程最好的情况(关键字在记录序列中顺序有序):
最好的情况(关键字在记录序列中顺序有序):
最坏的情况(关键字在记录序列中逆序有序):
最坏的情况(关键字在记录序列中逆序有序):
直接插入排序算法分析:
直接插入排序算法分析:
“比较比较”的次数:
的次数:
“比较比较”的次数:
的次数:
00“移动移动”的次数:
的次数:
“移动移动”的次数:
的次数:
99.2.2.1.1直接插入排序直接插入排序10平均的情况:
平均的情况:
若待排序对象序列中出现各种可能排若待排序对象序列中出现各种可能排列的概率相同,则可取上述最好情况和最坏情况的平列的概率相同,则可取上述最好情况和最坏情况的平均情况。
在平均情况下的关键码比较次数和对象移动均情况。
在平均情况下的关键码比较次数和对象移动次数约为次数约为nn22/4/4。
空间效率:
空间效率:
OO(11)因为仅占用因为仅占用11个缓冲单元个缓冲单元99.2.2.1.1直接插入排序直接插入排序99.2.2.1.1直接插入排序直接插入排序直接插入排序的时间复杂度为直接插入排序的时间复杂度为O(O(nn22)。
直接插入排序是一种稳定的排序方法。
直接插入排序是一种稳定的排序方法。
1299.2.2.2.2折半插入排序折半插入排序当记录数量当记录数量nn的很大时,不宜采取直的很大时,不宜采取直接插入排序的方法。
接插入排序的方法。
因为因为R1.i-1R1.i-1是一个按关键字有是一个按关键字有序的有序序列,则可以利用折半查找实现序的有序序列,则可以利用折半查找实现“在在R1.i-1R1.i-1中查找中查找RiRi的插入位置的插入位置”,如此实现的插入排序为,如此实现的插入排序为折半插入排序折半插入排序。
13voidBiInsertionSort(SqList&L)/BInsertSort在在L.r1.i-1中折半查找插入位置;中折半查找插入位置;for(i=2;i=high+1;-j)L.rj+1=L.rj;/记录后移记录后移L.rhigh+1=L.r0;/插入插入99.2.2.2.2折半插入排序折半插入排序low=1;high=i-1;while(low=high)m=(low+high)/2;/折半折半if(L.r0.keyL.rm.key)high=m-1;/插入点在低半区插入点在低半区elselow=m+1;/插入点在高半区插入点在高半区14364952805861239775ilowhighmmlowlowmhigh14364952586180239775ilowhighmhighmhighmlow例如例如:
再如再如:
插入插入位置位置插入插入位置位置L.rL.ri=1(30)1370853942620i=213(1330)70853942620i=76(6133039427085)20i=820(6133039427085)20lowhighmidi=820(6133039427085)20lowhighmidi=820(6133039427085)20midhighlowi=820(613203039427085)折半插入排序过程折半插入排序过程时时间间效效率率:
在在插插入入第第ii个个对对象象时时,需需要要经经过过loglog22ii+1+1次次关关键键码码的的比比较较,才才能能确确定定它它应应插插入入的的位位置置。
因因此此,将将nn个个对对象象用用折折半半插插入入排排序序所所进进行行的的关关键键码码比比较较次次数数为为:
n*logn*log22nn但但是是移移动动次次数数并并未未减减少少,所所以以排排序序效效率率仍仍为为O(nO(n22)。
空间效率:
空间效率:
OO(11)稳定性:
稳定性:
稳定稳定折半插入排序的算法分析折半插入排序的算法分析讨论:
讨论:
若记录是链表结构,用直接插若记录是链表结构,用直接插入排序行否?
折半插入排序呢?
入排序行否?
折半插入排序呢?
答:
答:
直接插入不仅可行,而且还无需直接插入不仅可行,而且还无需移动元素,时间效率更高!
移动元素,时间效率更高!
链表无法“折半”!
折半插入排序的算法分析折半插入排序的算法分析19小结小结直接插入排序的时间复杂性直接插入排序的时间复杂性O(n2)折半插入排序的时间复杂性折半插入排序的时间复杂性O(n2)两种排序方法都是两种排序方法都是稳定的稳定的。
209.2.22-路插入排序路插入排序2-路插入排序是在折半插入排序的基础路插入排序是在折半插入排序的基础上改进而来,其目的是减少排序过程中移动上改进而来,其目的是减少排序过程中移动记录的次数记录的次数,但需要,但需要n个记录的辅助空间。
个记录的辅助空间。
具体做法:
确定中间记录,将待插记录具体做法:
确定中间记录,将待插记录与中间值比较,小于中间值,则与中间值比较,小于中间值,则直接插入直接插入到到前半部分的有序表中。
反之,直接插入到后前半部分的有序表中。
反之,直接插入到后半部分的有序表中。
在算法实现时,可以设半部分的有序表中。
在算法实现时,可以设两个指针,两个指针,first和和final分别指示排序过程中分别指示排序过程中得到的有序序列的第一个记录和最后一个记得到的有序序列的第一个记录和最后一个记录。
录。
2199.2.2.2.22-路插入排序路插入排序排序排序49,38,65,97,76,13,27,49*49493849653849659738496576973849657697133849657697132738分治的思想分治的思想例例229.2.39.2.3希尔希尔(shell)shell)排序排序(又称缩小增量排序)(又称缩小增量排序)基本思想:
基本思想:
对待排记录序列先作对待排记录序列先作“宏观宏观”调整,再调整,再作作“微观微观”调整。
调整。
所谓所谓“宏观宏观”调整,指的是,调整,指的是,“跳跃式跳跃式”的插入排序。
的插入排序。
技巧:
技巧:
子序列的构成不是简单地子序列的构成不是简单地“逐段分割逐段分割”,而,而是将相隔某个增量是将相隔某个增量dkdk的记录组成一个子序列的记录组成一个子序列,让增量让增量dkdk逐趟缩短(例如依次取逐趟缩短(例如依次取5,3,15,3,1),直到),直到dkdk11为止。
为止。
优点:
优点:
让关键字值小的元素能很快前移,且序列若让关键字值小的元素能很快前移,且序列若基本有序时,再用直接插入排序处理,时间效率会基本有序时,再用直接插入排序处理,时间效率会高很多。
高很多。
将记录序列分成若干子序列,分别对每个子序列进行插将记录序列分成若干子序列,分别对每个子序列进行插入排序。
入排序。
其中,其中,dd称为增量,它的值在排序过程中从大到小逐称为增量,它的值在排序过程中从大到小逐渐缩小,直至最后一趟排序渐缩小,直至最后一趟排序减为减为11。
例如:
将例如:
将n个记录分成个记录分成d个子序列:
个子序列:
R1,R1+d,R1+2d,R1+kdR2,R2+d,R2+2d,R2+kdRd,R2d,R3d,Rkd,R(k+1)d9.2.39.2.3希尔希尔(shell)shell)排序排序例:
例:
关键字序列关键字序列T=(49T=(49,3838,6565,97,76,13,27,4997,76,13,27,49*,55,55,0404),),请写出希尔排序的具体实现过程。
请写出希尔排序的具体实现过程。
算法分析:
算法分析:
开始时开始时dkdk的值较大,子序列中的对象的值较大,子序列中的对象较少,排序速度较快;随着排序进展,较少,排序速度较快;随着排序进展,dkdk值逐渐值逐渐变小,子序列中对象个数逐渐变多,由于前面工变小,子序列中对象个数逐渐变多,由于前面工作的基础,大多数对象已基本有序,所以排序速作的基础,大多数对象已基本有序,所以排序速度仍然很快。
度仍然很快。
380123456789104938659776132749*5504初态:
初态:
第第1趟趟(dk=5)第第2趟趟(dk=3)第第3趟趟(dk=1)4913134938276549*9755760427386549*975513
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 算法 内部 排序 插入