算法设计与分析-蛮力思想.ppt
《算法设计与分析-蛮力思想.ppt》由会员分享,可在线阅读,更多相关《算法设计与分析-蛮力思想.ppt(40页珍藏版)》请在三一办公上搜索。
1、第3章 排序基础,广东工业大学计算机学院,数据结构,3.1 排序的概念与分类3.1.1 排序的概念3.1.2 排序的分类3.2 直接插入排序3.3 希尔排序3.4 基数排序3.4.1 多关键字排序3.4.2 基数排序,第3章 排序基础,3.1 排序的概念与分类,含有多个域的数据元素称为记录。用于对记录进行唯一标识的域称为关键字。为了与元素类型ElemType区别,记录类型定义为RecordType。typedef int KeyType;/关键字类型为整数类型typedef struct KeyType key;/关键字项/其它数据项 RecordType,RcdType;/记录类型,3.1.
2、1 排序的概念,排序是将一组“无序”的记录序列调整为“有序”的记录序列。例如,将下列关键字序列:(175,85,260,63,412,504,840,518,630,950)调整为有序序列:(63,85,175,260,412,504,518,630,840,950),什么是排序,假设含n个记录的序列为(r1,r2,rn)其相应的关键字序列为(k1,k2,kn)这些关键字相互之间可以进行比较,即在它们之间存在着这样一个关系 kp1kp2kpn按此固有关系将上式记录序列重新排列为(rp1,rp2,,rpn)的操作称作排序。,记录顺序表的类型定义,typedef struct RcdType*rc
3、d;/存储空间基址 int length;/当前长度 int size;/存储容量 RcdSqList;/记录的顺序表注意:顺序表的0号单元闲置或用作哨兵。在后面的讨论中,前后文意思清楚的情况下,约定:把“记录的关键字的大小”和“记录的关键字的比较”简称为“记录的大小”和“记录的比较”。将“元素的关键字的大小”和“结点的关键字大小”简称为“元素的大小”和“结点的大小”。,3.1.2 排序的分类,根据在排序过程中涉及的存储器不同,可将排序方法分为两大类:内部排序和外部排序。内部排序是指待排序列完全存放在内存中所进行的排序过程,适合不太大的元素序列。外部排序指的是大文件的排序,待排序的文件无法一次
4、装入内存,将待排序的记录存储在外存储器上,需要在内存和外部存储器之间进行多次数据交换,以达到排序整个文件的目的。,内部排序的分类,内部排序方法分为五类:交换排序、选择排序、插入排序、归并排序和基数排序。其中交换排序、选择排序和插入排序是一个逐步扩大记录的有序序列长度的过程。,有序序列区,无 序 序 列 区,有序序列区,无 序 序 列 区,排序的介绍,交换排序是对无序区中记录的关键字两两进行比较,若逆序则交换,直到关键字之间不存在逆序为止。冒泡排序和快速排序是交换排序中最典型的两个方法。选择排序是在无序区中选出关键字最小的记录,置于有序区的最后,直到全部记录有序。简单选择排序和堆排序是选择排序中
5、最典型的两个方法。,2,1,3,4,5,2,1,3,4,5,排序的介绍,插入排序是将无序区中的一个记录插入至有序区,使得有序区的长度加1,直到全部记录有序。直接插入排序和希尔排序是插入排序中最具代表性的两个方法。归并排序是不断将两个或两个以上有序区合并成一个有序区,直到全部记录有序。基数排序是和前面所述各类排序方法完全不同的一种排序方法,不需要进行记录关键字的比较。,2,1,3,4,5,排序算法的时间复杂度分类,内部排序方法按时间复杂度分为三类:简单的排序方法,时间复杂度为O(n2);先进的排序方法,时间复杂度为O(nlogn);基数排序,时间复杂度为O(n)。希尔排序的算法时间复杂度与增量序
6、列有关,还涉及到一些数学上尚未解决的难题,其算法时间复杂度不属于以上类别。每一种排序方法都有各自的优缺点,适合于不同的应用场合。为方便起见,若非特意强调,排序的实施均为非递减有序排序。,直接插入排序,假如8个记录的关键字序列为(56,68,25,45,90,38,10,72),每一趟的排序过程可参看下图:第i趟插入排序将记录L.rcdi+1插入到有序区L.rcd1.i中,插入前需要找到插入位置,移动记录空出插入位置。,45,45,68,90,算法实现分析,查找插入位置从有序区的位置1到i,判断是否为记录L.rcdi+1的插入位置j,代码为:j=1;while(L.rcdj.keyj)L.rcd
7、k+1=L.rcdk;k-;/从后到前移动记录若将判断插入位置的次序改为从i到1,则可将上述两步的代码合并为:L.rcd0=L.rcdi+1;j=i;while(j0/从后到前查找并移动记录0号单元存放了记录L.rcdi+1,判断j是否越界的操作“j0”可以略去。L.rcd0起到了边界监视哨的作用,称为哨兵。,直接插入排序,void InsertSort(RcdSqList&L),设置哨兵 查找插入位置,移动记录空出插入位置 插入记录,void InsertSort(RcdSqList/插入,0,38,1,j,i,i+1,25,45,56,68,90,10,72,38,38,直接插入排序算法性
8、能分析,排序算法的时间耗费主要与关键字比较和记录移动的次数相关。最好的情况(关键字在记录序列中顺序有序),“比较”的次数:,“比较”的次数:,0,“移动”的次数:,“移动”的次数:,直接插入排序的最好情况下时间复杂度为O(n),最坏情况下时间复杂度为O(n2)。,最坏的情况(关键字在记录序列中逆序有序),直接插入排序只需要一个记录的辅助空间,其空间复杂度为O(1)。,希尔排序,希尔排序是将整个待排记录序列(R1,R2,R3,Rn)按增量d划分成d个子序列,其中第i(1id)个子序列为(Ri,Ri+d,Ri+2d,Ri+kd),13,55,38,76,27,04,65,49,49,97,1,2,
9、3,4,5,6,7,8,9,10,3.3 希尔排序,分别对各子序列进行直接插入排序;不断减小增量d,重复这一过程;直到d减少到1,对整个序列进行一次直接插入排序。增量d的取值序列称为增量序列。基于增量序列的降序特点,希尔排序也被称为“缩小增量排序”。,希尔排序实例,待排序列(49,38,65,97,76,13,27,49,55,04)第一趟排序的增量d1为5 结果为(13,27,49,55,04,49,38,65,97,76),13,49,27,38,65,49,97,55,76,04,1,2,3,4,5,6,7,8,9,10,希尔排序实例,第二趟希尔排序的增量d2为3结果为(13,04,49
10、,38,27,49,55,65,97,76)第三趟的增量d3为1,最后结果为(04,13,27,38,49,49,55,65,76,97),13,55,38,76,27,04,65,49,49,97,1,2,3,4,5,6,7,8,9,10,希尔排序与直接插入排序,直接插入排序每次对相邻记录进行比较,记录最多只移动了一个位置,希尔排序每次对相隔较远距离(即增量)的记录进行比较,使得记录移动时能跨过多个记录,实现宏观上的调整。希尔排序的最后一趟排序(增量为1),序列已基本有序,接近最好情况(微观调整)的直接插入排序。可将前面各趟的“宏观”调整看成是最后一趟的预处理,实现比只做一次直接插入排序效率
11、更高。,void ShellInsert(RcdSqList/插入,一趟希尔排序,void ShellInsert(RcdSqList&L,int dk),暂存待插入记录 按增量dk查找插入位置,移动记录空出插入位置 插入记录,0,49,i-3,j,i,i+3,13,04,49,55,27,65,38,97,76,38,38,希尔排序,void ShellSort(RcdSqList/一趟增量为dk的插入排序,希尔排序的时间复杂度分析,希尔排序的时间复杂度分析是一个复杂的问题,因为它的时间复杂度是所取增量序列的函数,这涉及到一些数学上尚未解决的难题。有研究指出,当增量序列为dk=2t-k+1-
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 算法 设计 分析 思想

链接地址:https://www.31ppt.com/p-6056241.html