收藏 分享(赏)

t9(1)-基本概念和插入类排序.ppt

上传人:天天快乐 文档编号:765901 上传时间:2018-04-22 格式:PPT 页数:36 大小:1.06MB
下载 相关 举报
t9(1)-基本概念和插入类排序.ppt_第1页
第1页 / 共36页
t9(1)-基本概念和插入类排序.ppt_第2页
第2页 / 共36页
t9(1)-基本概念和插入类排序.ppt_第3页
第3页 / 共36页
t9(1)-基本概念和插入类排序.ppt_第4页
第4页 / 共36页
t9(1)-基本概念和插入类排序.ppt_第5页
第5页 / 共36页
点击查看更多>>
资源描述

1、第九章,排序,排序的基本概念插入类排序交换类排序法选择类排序法归并排序各种排序方法的综合比较总结与提高,本章目标,9.1 排序的基本概念,排序:将一组杂乱无章的数据按一定的规律顺次排列起来。 内部排序 外部排序,内部排序:整个排序过程完全在内存中进行,称为内部排序。,外部排序:由于待排序记录数据量太大,内存无法容纳全部数据,排序需要借助外部存储设备才能完成,称为外部排序。,假设Ki是Ri 的主关键字,Kj是Rj 的主关键字,稳定排序:若Ki=Kj(1in,1jn,ij),在排序前的序列中Ri领先于Rj(即ij),经过排序后得到的序列中Ri仍领先于Rj,则称所用的排序方法是稳定的 ;不稳定排序:

2、反之,当相同关键字的领先关系在排序过程中发生变化者,则称所用的排序方法是不稳定的。,在排序过程中,一般进行两种基本操作:,(1)比较两个关键字的大小; (2)将记录从一个位置移动到另一个位置。,对于第二种操作,需要采用适当地存储方式,向量结构链表结构记录向量与地址向量结合的表示方法,我们重点来讨论在向量存储结构上各种排序方法的实现。,9.2 插入类排序,基本思想:在一个已排好序的记录子集的基础上,每一步将下一个待排序的记录有序插入到已排好序的记录子集中,直到将所有待排记录全部插入为止。直接插入排序折半插入排序希尔排序,9.2.1 直接插入排序,基本操作:将第i个记录插入到前面i-1个已排好序的

3、记录中,具体过程为:将第i个记录的关键字Ki顺次与其前面记录的关键字Ki-1,Ki-2,K1进行比较,将所有关键字大于Ki的记录依次向后移动一个位置,直到遇见一个关键字小于或者等于Ki的记录Kj,此时Kj后面必为空位置,将第i个记录插入空位置即可。,21,25,49,25*,16,08,0 1 2 3 4 5 6,0 1 2 3 4 56,21,49,25*,16,08,i = 2,0 1 2 3 4 5 6,21,25,25*,16,08,i = 3,无序数组,49,监视哨,25,25,25*,21,25,49,16,08,0 1 2 3 4 56,0 1 2 3 4 5 6,21,25,4

4、9,25*,16,08,i = 5,0 1 2 3 4 5 6,21,25,49,25*,16,08,i = 6,i = 4,16,08,=, 48 62 35 77 55 14 35 98 48 62 35 77 55 14 35 98 35 48 62 77 55 14 35 98 35 48 62 77 55 14 35 98 35 48 55 62 77 14 35 98 14 35 48 55 62 77 35 98 14 35 35 48 55 62 77 98 14 35 35 48 55 62 77 98 ,实例2:,稳定的排序方法,假设待排序记录存放在r1.n之中为了提高效率

5、,我们附设一个监视哨r0,使得r0始终存放待插入的记录。,算法描述:,void InsSort(RecordType r,int length)/*对数组r做直接插入排序,length为记录个数*/ for ( i=2 ; i =length ; i+ )/第一个元素已有序 r0=ri; /*将待插入记录存放到r0中*/j=i-1; while (r0.key rj.key ) /寻找插入位置 rj+1= rj; /后移j=j-1; /*将待插入记录插入到已排序的序列中*/ rj+1=r0; /* InsSort */,直接插入排序算法,该算法的要点是:使用监视哨r0临时保存待插入的记录。从后

6、往前查找应插入的位置。查找与移动用同一循环完成。,直接插入排序算法分析:,从空间角度来看,它只需要一个辅助空间r0。 从时间耗费角度来看,主要时间耗费在关键字比较和移动元素上。,最好的情况:,顺序排列,总的比较次数:,n-1次,总的移动次数:,2(n-1)次,最坏的情况:,总的比较次数:,总的移动次数:,逆序排列,(n+2)(n-1)/2次,(n+4)(n-1)/2次,9.2.2 折半插入排序,算法思想:将折半查找用于在有序记录r1i-1中确定应插入的位置。,void BinSort (RecordType r,int length)/*对记录数组r进行折半插入排序,length为记录个数*/

7、for ( i=2 ; i= low; -j ) rj+1= rj; rlow=x; /* 插入记录 */ ,采用折半插入排序法,减少关键字的比较次数。 每插入一个元素,需要比较的次数最大为折半判定树的深度,如插入第i个元素时,设i=2j,则约需进行log2i次比较(取上整数) 因此插入n-1个元素的平均关键字的比较次数为O(nlog2n)。,算法分析:,虽然折半插入排序法与直接插入排序法相比较,改善了算法中比较次数的数量级,但其并未改变移动元素的时间耗费,所以折半插入排序的总的时间复杂度仍然是O(n2)。,算法分析:,9.2.3 希尔排序,又称缩小增量排序法 利用直接插入排序的最佳性质:将待

8、排序的关键字序列分成若干个较小的子序列,对子序列进行直接插入排序,使整个待排序序列排好序。经过多次调整,序列已基本有序,最后再对序列进行直接插入排序。,void ShellSort(RecordType r, int length, int delt, int n)/*对记录数组r做希尔排序,length为记录个数,delta 为增量数组,n为delta的长度 */ int i;for(i=0 ; i=n-1; +i)ShellInsert(r, length, delti);,delt数组,length=8n=3,void ShellInsert(RecordType r, int leng

9、th, int delta)/*length为记录个数,delta 为增量*/int i,j;for(i=1+delta; i0 /*ShellInsert*/,46,55,13,42,94,17,0 1 2 3 4 5 678,假设经过delta=4的调整后,得到上面的序列再取delta= 2:,05,70,46,55,13,42,94,17,0 1 2 3 4 5 678,05,70,i=3i=8,46,55,13,42,94,17,0 1 2 3 4 5 678,05,70,i=3,j=1-2,46,55,13,42,94,17,0 1 2 3 4 5 678,05,70,i=4,46,55,13,42,94,17,0 1 2 3 4 5 678,05,70,i=5,46,55,13,42,94,17,0 1 2 3 4 5 678,05,70,i=6,46,55,42,94,17,0 1 2 3 4 5 678,05,70,i=7,13,46,55,42,94,17,0 1 2 3 4 5 678,05,70,i=8,13,致此,序列已基本排好序,不稳定的排序算法!,逆转数:对于待排序序列中的某个记录的关键字,它的逆转数是指在它之前比此关键字大的关键字个数。,算法分析:,时间复杂度:,算法分析:,比较,见课本P305面表92,表93,谢谢!,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 经营企划

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报