【精品】插入排序.ppt
《【精品】插入排序.ppt》由会员分享,可在线阅读,更多相关《【精品】插入排序.ppt(60页珍藏版)》请在三一办公上搜索。
1、第 九 章排序,9.1 概述9.2 插入排序9.3 交换排序9.4 选择排序9.5 归并排序9.6 基数排序9.7 各种内部排序方法比较,排序的功能是将一个数据元素(或记录)的任意序列,重新排列成一个按关键字有序的序列.,9.1 概述,排序:有n个记录的序列R1,R2,Rn,其相应关键字的序列是K1,K2,Kn,相应的下标序列为1,2,n。通过排序,要求找出当前下标序列1,2,n的一种排列p1,p2,pn,使得相应关键字满足如下的非递减(或非递增)关系,即:Kp1 Kp2 Kpn,这样就得到一个按关键字有序的记录序列:Rp1,Rp2,Rpn。,9.1 概述,内部排序与外部排序:根据排序时数据所
2、占用存储器的不同,可将排序分为两类。一类是整个排序过程完全在内存中进行,称为内部排序;另一类是由于待排序记录数据量太大,内存无法容纳全部数据,排序需要借助外部存储设备才能完成,成为外部排序。,稳定排序与不稳定排序:,假设Ki=Kj(1in,1jn,ij),若在排序前的序列中Ri领先于Rj(即ij),经过排序后得到的序列中Ri仍领先于Rj,则称所用的排序方法是稳定的;反之,当相同关键字的领先关系在排序过程中发生变化者,则称所用的排序方法是不稳定的。12,45,123,67,45,89,在排序过程中,一般进行两种基本操作:(1)比较两个关键字的大小;(2)将记录从一个位置移动到另一个位置。本章主要
3、讨论在向量结构上各种排序方法的实现。为了讨论方便,假设待排记录的关键字均为整数,均从数组中下标为1的位置开始存储,下标为0的位置存储监视哨,或空闲不用。,#define MAXSIZE 20typedef int KeyType;typedef struct KeyType key;/关键字项OtherType other_data;/其他数据项 RedType;/记录类型typedef struct RedType rMAXSIZE+1;/r0闲置或作哨兵int length;/顺序表长度Sqlist;/顺序表类型,9.2 插入排序,9.2.1 直接插入排序9.2.2 折半插入排序9.2.3
4、 希尔排序,基本方法:将待排序文件中的记录,逐个地按其关键字值的大小插入到目前已经排好序的若干个记录组成的文件中的适当位置,并保持新文件有序。,9.2.1 直接插入排序,直接插入排序算法的思路是:初始可认为文件中的第1个记录己排好序,然后将第2个到第n个记录依次插入已排序的记录组成的文件中。在对第i个记录Ri进行插入时,R1,R2,Ri-1已排序,将记录Ri的关键字keyi与已经排好序的关键字从右向左依次比较,找到Ri应插入的位置,将该位置以后直到Ri-1各记录顺序后移,空出该位置让Ri插入。,图9.1 直接插入排序的例子。,1)48 62 35 77 55 14 35 98 2)48 62
5、35 77 55 14 35 983)35 48 62 77 55 14 35 984)35 48 62 77 55 14 35 985)3548 55 62 77 14 35 986)14 35 48 5562 77 35 98 7)14 35 35 48 55 62 77 98 8)14 35 35 48 55 62 7798,假设待排序记录存放在r1.n之中,为了提高效率,我们附设一个监视哨r0,使得r0始终存放待插入的记录。监视哨的作用有两个:一是备份待插入的记录,以便前面关键字较大的记录后移;二是防止越界.,void InsertSort(Sqlist/插入到正确位置,算法描述,算法
6、分析,该算法的要点是:使用监视哨r0临时保存待插入的记录。从后往前查找应插入的位置。查找与移动用同一循环完成。直接插入排序算法分析:首先从空间角度来看,它只需要一个辅助空间r0,空间复杂度为S(n)=O(1),算法分析,从时间耗费角度来看,主要时间耗费在关键字比较和移动元素上。直接插入排序的时间复杂度:最好情况:初始有序,为O(n);最坏情况:初始逆序,为O(n2);平均时间复杂度T(n)=O(n2)直接插入排序方法是稳定的排序方法。直接插入排序算法简便,比较适用于待排序记录数目较少且基本有序的情况。当待排记录数目较大时,直接插入排序的性能就不好,9.2.2 折半插入排序,在直接插入排序中,我
7、们采用顺序查找法来确定记录的插入位置。由于(R1,R2,Ri-1)是有序子文件,我们可以采用折半查找法来确定Ri的插入位置,这种排序称为折半插入排序(二分插入排序)。,排序思想,根据插入排序的基本思想,在找第i个记录的插入位置时,前i-l个记录已排序,将第i个记录的排序码keyi和已排序的前i-1个的中间位置记录的排序码进行比较,如果keyi小于中间位置记录排序码,则可以在前半部继续使用二分法查找,否则在后半部继续使用二分法查找,直到查找范围为空,即可确定keyi的插入位置。,图9.2 折半插入排序的例子。,1)48 62 35 77 55 14 35 98 2)48 62 35 77 55
8、14 35 983)35 48 62 77 55 14 35 984)35 48 62 77 55 14 35 985)3548 55 62 77 14 35 986)14 35 48 5562 77 35 98 7)14 35 35 48 55 62 77 98 8)14 35 35 48 55 62 7798,55,算法实现:,void BInsertSort(Sqlist/插入记录/for,算法分析,采用折半插入排序法,可减少关键字的比较次数。每插入一个元素,需要比较的次数最大为折半判定树的深度,因此插入n-1个元素的平均关键字的比较次数为O(nlog2n)。虽然折半插入排序法与直接插入
9、排序法相比较,改善了算法中比较次数的数量级,但其并未改变移动元素的时间耗费,所以折半插入排序的总的时间复杂度仍然是O(n2)。,9.2.3 希尔排序,希尔排序(Shells Method)又称“缩小增量排序”(Diminishing Increment Sort),是由D.L.Shell在1959年提出来的。希尔排序的基本思想是:先将待排序记录序列分割成若干个“较稀疏的”子序列,分别进行直接插入排序。经过上述粗略调整,整个序列中的记录已经基本有序,最后再对全部记录进行一次直接插入排序。,具体实现:首先选定两个记录间的距离d1,在整个待排序记录序列中将所有间隔为d1的记录分成一组,进行组内直接插
10、入排序,然后再取两个记录间的距离d2d1,在整个待排序记录序列中,将所有间隔为d2的记录分成一组,进行组内直接插入排序直至选定两个记录间的距离dt=1为止,此时只有一个子序列,即整个待排序记录序列。,图9.3 希尔排序过程的实例,void ShellInsert(Sqlist L,int dk)/对顺序表L做一趟希尔插入排序 for(i=dk+1;i0 j-=dk)L.rj+dk=L.rj;L.rj+dk=L.r0;/*ShellInsert*/,算法描述,void ShellSort(Sqlist&L,int dlta,int t)/*按增量序列dlta0.t-1对顺序表L做希尔排序*/fo
11、r(k=0;kt;+k)ShellInsert(L,dltak);,算法描述续,算法分析,希尔排序的分析是一个复杂的问题,因为它的时间耗费是所取的“增量”序列的函数。到目前为止,尚未有人求得一种最好的增量序列。但大量研究也得出了一些局部的结论。在排序过程中,相同关键字记录的领先关系发生变化,则说明该排序方法是不稳定的。,9.3 交换排序,9.3.1 冒泡排序9.3.2 快速排序,9.3.1 冒泡排序,冒泡排序是一种简单的交换类排序方法,它是通过相邻的数据元素的交换,逐步将待排序序列变成有序序列的过程。冒泡排序的基本思想是:从头扫描待排序记录序列,在扫描的过程中顺次比较相邻的两个元素的大小。以升
12、序为例:在第一趟排序中,对n 个记录进行如下操作:若相邻的两个记录的关键字比较,逆序时就交换位置。在扫描的过程中,不断的将相邻两个记录中关键字大的记录向后移动,最后将待排序记录序列中的最大关键字记录换到了待排序记录序列的末尾,这也是最大关键字记录应在的位置。然后进行第二趟冒泡排序,对前n-1个记录进行同样的操作,其结果是使次大的记录被放在第n-1个记录的位置上。如此反复,直到排好序为止(若在某一趟冒泡过程中,没有发现一个逆序,则可结束冒泡排序),所以 冒泡过程最多进行n-1趟。,图9.3 冒泡排序示例,48,35,62,55,14,35,77,22,40,98,48,35,62,55,62,1
13、4,62,35,77,22,77,40,1趟,2趟,3趟,4趟,5趟,6趟,算法描述,void Bubble_Sort(Sqlist change=TRUE;,算法分析,最坏情况下,待排序记录按关键字的逆序进行排列,此时,每一趟冒泡排序需进行i次比较,3i次移动。经过n-1趟冒泡排序后,总的比较次数为总的移动次数为3n(n-1)/2 次,因此该算法的时间复杂度为O(n2),空间复杂度为O(1)。另外,冒泡排序法是一种稳定的排序方法。,9.3.2 快速排序,快速排序的基本思想是:从待排序记录序列中选取一个记录(通常选取第一个记录),其关键字设为K1,然后将其余关键字小于K1的记录移到前面,而将关
14、键字大于K1的记录移到后面,结果将待排序记录序列分成两个子表,最后将关键字为K1的记录插到其分界线的位置处。我们将这个过程称作一趟快速排序。通过一次划分后,就以关键字为K1的记录为分界线,将待排序序列分成了两个子表,且前面子表中所有记录的关键字均不大于K1,而后面子表中的所有记录的关键字均不小于K1。对分割后的子表继续按上述原则进行分割,直到所有子表的表长不超过1为止,此时待排序记录序列就变成了一个有序表。,38,49,65,97,76,13,27,49,初始关键字,49,pivotkey,27,65,13,97,49,27,38,13,49,76,97,65,49,1趟,27,13,38,2
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 精品 插入 排序
链接地址:https://www.31ppt.com/p-2207129.html