数据结构课件9.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《数据结构课件9.ppt》由用户(三亚风情)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课件
- 资源描述:
-
1、西安科技大学精品课程西安科技大学精品课程第第7 7章章 图图第第9章章 排序排序 9.1 排序的基本概念排序的基本概念9.2 简单排序方法简单排序方法 9.3 先进排序方法先进排序方法 9.4 各种排序方法的综合比较各种排序方法的综合比较 9.5 外排序简介外排序简介西安科技大学精品课程西安科技大学精品课程第第7 7章章 图图9.1 排序的基本概念排序的基本概念 1. 排序排序 是按关键字的非递减或非递增顺序对一组记录重新进行排列是按关键字的非递减或非递增顺序对一组记录重新进行排列的操作。的操作。描述如下:描述如下: 假设含有假设含有n个记录的序列为个记录的序列为 r1,r2,rn 它们的关键
2、字相应为它们的关键字相应为 k1,k2,kn 使其关键字满足如下非递减(或非递增)关系:使其关键字满足如下非递减(或非递增)关系: 也就是使记录序列重新排列成一个按关键字有序的序列也就是使记录序列重新排列成一个按关键字有序的序列 pnppkkk2121pnpprrr西安科技大学精品课程西安科技大学精品课程第第7 7章章 图图 2. 排序的稳定性排序的稳定性 假设假设Ki=Kj(1in,1jn,ij), 若在排序前的序列中若在排序前的序列中Ri领先领先于于Rj(即即ij),排序后,排序后Ri仍领先于仍领先于Rj, 称排序方法是稳定的;称排序方法是稳定的; 若相同关键字的领先关系在排序过程中发生变
3、化,称为不稳若相同关键字的领先关系在排序过程中发生变化,称为不稳定的排序。定的排序。 证明一种排序方法是稳定的,要从算法本身的步骤中加以证明一种排序方法是稳定的,要从算法本身的步骤中加以证明。证明。 证明排序方法是不稳定的,只需给出一个反例说明证明排序方法是不稳定的,只需给出一个反例说明西安科技大学精品课程西安科技大学精品课程第第7 7章章 图图在排序过程中,一般进行在排序过程中,一般进行两种基本操作两种基本操作: 比较两个关键字的大小;比较两个关键字的大小; 将记录从一个位置移动到另一个位置。将记录从一个位置移动到另一个位置。三种常见的三种常见的存储方法存储方法: 向量结构向量结构:将待排序
4、的记录存放在一组地址连续的存储单:将待排序的记录存放在一组地址连续的存储单元中。由于在这种存储方式中,记录之间的次序关系由其存储元中。由于在这种存储方式中,记录之间的次序关系由其存储位置来决定,所以排序过程中一定要移动记录才行。位置来决定,所以排序过程中一定要移动记录才行。 链表结构链表结构:采用链表结构时,记录之间逻辑上的相邻性:采用链表结构时,记录之间逻辑上的相邻性是靠指针来维持的,这样在排序时,就不用移动记录元素,而是靠指针来维持的,这样在排序时,就不用移动记录元素,而只需要修改指针。只需要修改指针。 这种排序方式被称为链表排序。这种排序方式被称为链表排序。西安科技大学精品课程西安科技大
5、学精品课程第第7 7章章 图图 记录向量与地址向量结合记录向量与地址向量结合:将待排序记录存放在一组地:将待排序记录存放在一组地址连续的存储单元中,同时另设一个指示各个记录位置的地址址连续的存储单元中,同时另设一个指示各个记录位置的地址向量。在排序过程中不移动记录本身,而修改地址向量中的向量。在排序过程中不移动记录本身,而修改地址向量中的“地址地址”,排序结束后,再按照地址向量中的值调整记录的存,排序结束后,再按照地址向量中的值调整记录的存储位置。这种排序方式被称为地址排序。储位置。这种排序方式被称为地址排序。 为了讨论方便,为了讨论方便,假设待排记录的关键字均为整数,从数组假设待排记录的关键
6、字均为整数,从数组下标为下标为1 1的位置开始存储,下标为的位置开始存储,下标为0 0的位置存储监视哨,或空闲的位置存储监视哨,或空闲不用。不用。西安科技大学精品课程西安科技大学精品课程第第7 7章章 图图#define MAXSIZE 20 /*一个用作示例的小顺序表的最大长度一个用作示例的小顺序表的最大长度*/typedef int KeyType;typedef struct KeyType key; OtherType otherdata; RecordType; typedef struct RecordType rMAXSIZE+1; /*r0闲置或作为判别标志的闲置或作为判别标志
7、的“哨兵哨兵”单元单元*/ int length; /*顺序表长度顺序表长度*/SqList; /*顺序表类型顺序表类型*/西安科技大学精品课程西安科技大学精品课程第第7 7章章 图图根据在排序中涉及的存储器不同,将排序方法分为两大类:根据在排序中涉及的存储器不同,将排序方法分为两大类:(1)内部排序内部排序:整个排序过程完全在内存中进行。:整个排序过程完全在内存中进行。(2)外部排序外部排序:由于待排序记录数据量太大,在排序过程中需:由于待排序记录数据量太大,在排序过程中需要对外存进行访问的排序过程。要对外存进行访问的排序过程。按排序算法的时间复杂度来分,可分为三类:按排序算法的时间复杂度来
8、分,可分为三类:(1)简单的排序方法,其时间复杂度为)简单的排序方法,其时间复杂度为O(n2););(2)先进的排序方法,其时间复杂度为)先进的排序方法,其时间复杂度为O(nlogn););(3)基数排序,其时间复杂度为)基数排序,其时间复杂度为O(d*n)。)。西安科技大学精品课程西安科技大学精品课程第第7 7章章 图图9.2.1简单选择排序(简单选择排序(selection sort) 在简单选择排序的过程中,待排记录序列的状态为:在简单选择排序的过程中,待排记录序列的状态为:基本思想:基本思想: 第第i趟排序操作:从无序序列趟排序操作:从无序序列Ri.n的的n-i+1记录中选出关键记录中
9、选出关键字最小的记录字最小的记录Rj和和Ri交换,从而使有序序列区从交换,从而使有序序列区从R1.i-1扩大扩大至至R1.i,如图,如图9.1所示。所示。有序序列有序序列R1i-1无序序列无序序列Ri.n9.2 简单排序方法简单排序方法 常用的有常用的有简单选择排序简单选择排序、插入排序插入排序和和起泡排序起泡排序。 西安科技大学精品课程西安科技大学精品课程第第7 7章章 图图西安科技大学精品课程西安科技大学精品课程第第7 7章章 图图一趟简单选择排序算法一趟简单选择排序算法void SelectPass(SqList *L, int i) RecordType temp; j=i; / *j
10、指示关键字最小记录的位置,初值设为指示关键字最小记录的位置,初值设为i*/ for(k=i+1; klength; k+) if (L-rk.keyrj.key) j=k; /*暂不进行记录交换,只记录位置暂不进行记录交换,只记录位置*/ if (i!=j) /*最后交换记录最后交换记录Rj和和Ri*/ temp =L-rj; L-rj=L-ri; L-ri= temp; /*SelectPass 西安科技大学精品课程西安科技大学精品课程第第7 7章章 图图整个选择排序是一趟选择排序过程的多次重复,其算法如下:整个选择排序是一趟选择排序过程的多次重复,其算法如下:void SelectSort
11、 (SqList *L) /*对顺序表对顺序表L作简单选择排序作简单选择排序*/RecordType temp; for(i=1; ilength; +i) /*选择第选择第i个小的记录,并交换到位个小的记录,并交换到位*/ j=i; for(k=i+1; klength; k+) /*在在L.ri.L.length中选择中选择key最小的记录最小的记录*/ if(L-rk.keyrj.key) j=k; if (i!=j) temp=L-rj; L-rj=L-ri; L-.ri=temp; /*与第与第i个记录交换个记录交换*/ /*SelectSort西安科技大学精品课程西安科技大学精品课
12、程第第7 7章章 图图例如,对下列一组关键字:例如,对下列一组关键字: (491,38,65,492,76,13,27,52)西安科技大学精品课程西安科技大学精品课程第第7 7章章 图图2/ ) 1(12.)2() 1()(11nnnninni算法分析:算法分析:时间复杂度:时间复杂度:移动次数:移动次数: 最小最小 0 最大最大3(n-1)比较次数:比较次数:n-1, n-2, n-3,1 时间复杂度时间复杂度为为O(n2) 空间复杂度为空间复杂度为O(1) 就选择排序方法本身讲,它是一种稳定的排序方法,但图就选择排序方法本身讲,它是一种稳定的排序方法,但图9.2所表现出来的现象是不稳定的,
13、这是由于上述实现选择排序所表现出来的现象是不稳定的,这是由于上述实现选择排序的算法采用的的算法采用的“交换记录交换记录”的策略所造成的,若改变这个策略,的策略所造成的,若改变这个策略,可以写出不产生可以写出不产生“不稳定现象不稳定现象”的选择排序算法。的选择排序算法。西安科技大学精品课程西安科技大学精品课程第第7 7章章 图图9.2.2插入排序插入排序 1直接插入排序(直接插入排序(insertion sort) 基本思想:基本思想: 在一个已排好序的记录子集的基础上,每一步将下一个待在一个已排好序的记录子集的基础上,每一步将下一个待排序的记录有序地插入到已排好序的记录子集中,直到将所有待排序
14、的记录有序地插入到已排好序的记录子集中,直到将所有待排记录全部插入为止。排记录全部插入为止。 例如:打扑克牌时的抓牌,每抓一张牌,插入到合适位置,例如:打扑克牌时的抓牌,每抓一张牌,插入到合适位置,直到抓完牌为止,即可得到一个有序序列。直到抓完牌为止,即可得到一个有序序列。 西安科技大学精品课程西安科技大学精品课程第第7 7章章 图图基本操作:基本操作: 将当前无序序列区将当前无序序列区Ri.n中的记录中的记录Ri“插入插入”到有序序列区到有序序列区R1.i-1中,中,i=2,3,n。使有序序列区的长度增。使有序序列区的长度增1。 西安科技大学精品课程西安科技大学精品课程第第7 7章章 图图
15、例如:对一组关键字序列例如:对一组关键字序列49,38,65,492,76,13,27,52进行插入进行插入排序过程中,每一趟排序之后的状况如图排序过程中,每一趟排序之后的状况如图9.4所示。所示。西安科技大学精品课程西安科技大学精品课程第第7 7章章 图图 假设待排序记录存放在假设待排序记录存放在r1.n之中。为了提高效率,附设一之中。为了提高效率,附设一个监视哨个监视哨r0,使得,使得r0 存放待插入的记录。存放待插入的记录。 监视哨作用:监视哨作用: 一是备份待插入的记录,以便前面关键字较大的记录后移;一是备份待插入的记录,以便前面关键字较大的记录后移; 二是防止越界。二是防止越界。西安
16、科技大学精品课程西安科技大学精品课程第第7 7章章 图图void InsertPass(SqList *L, int i) L-r0=L-ri; /*复制为哨兵复制为哨兵*/ j=i-1; while (L-r0.key rj.key ) L-rj+1=L-rj; /*记录后移记录后移*/ j-; L-rj+1=L-r0 /*插入到正确位置插入到正确位置*/ /*InsertPass*/具体算具体算法描述如下:法描述如下: 整个插入排序需进行整个插入排序需进行n-1趟趟“插入插入”。只含一个记录的序列必。只含一个记录的序列必定是个有序序列,因此插入应从定是个有序序列,因此插入应从i=2起进行。
17、此外,若第起进行。此外,若第i个记录的个记录的关键字不小于第关键字不小于第i-1个记录的关键字,个记录的关键字,“插入插入”也就不需要进行了。也就不需要进行了。西安科技大学精品课程西安科技大学精品课程第第7 7章章 图图插入排序的算法如下:插入排序的算法如下:void InsertSort (SqList *L) for (i=2; ilength; +i) if (L-ri.keyri-1.key) /*当当“r0=L-ri; /*复制为哨兵复制为哨兵*/ j=i-1; while (L-r0.key.rj.key) L-rj+1=L-rj; /*记录后移记录后移*/ j-; L-rj+1=
18、L-r0; /*插入到正确位置插入到正确位置*/ /* if*/ /InsertPass*/西安科技大学精品课程西安科技大学精品课程第第7 7章章 图图算法性能分析:算法性能分析:从空间角度看,需一个辅助空间从空间角度看,需一个辅助空间r0。空间复杂度为空间复杂度为S(n)=O(1)。从时间耗费角度看,主要时间耗费在关键字比较和移动元素上。从时间耗费角度看,主要时间耗费在关键字比较和移动元素上。 最好情况:(记录有序)最好情况:(记录有序) 总的比较次数为总的比较次数为n-1次次 移动记录的次数也达到最小值移动记录的次数也达到最小值2(n-1)最坏情况:(记录逆序)最坏情况:(记录逆序) 总的
19、比较次数达到最大值为总的比较次数达到最大值为(n+2)(n-1)/2, 记录移动的记录移动的次数也达到最大值次数也达到最大值(n+4)(n-1)/2。 时间复杂度为时间复杂度为T(n)=O(n2) 直接插入排序是稳定的排序方法直接插入排序是稳定的排序方法。 适用:待排序记录数目较少且基本有序的情况。适用:待排序记录数目较少且基本有序的情况。西安科技大学精品课程西安科技大学精品课程第第7 7章章 图图 2折半插入排序折半插入排序 在有序表中确定插入位置,采用折半查找确定插入位置,即在有序表中确定插入位置,采用折半查找确定插入位置,即在有序表在有序表r1.i-1中用折半查找确定第中用折半查找确定第
20、i个元素的插入位置。个元素的插入位置。时间复杂度:时间复杂度: 比较次数减少了,最大为折半判定树的深度。但移动次数比较次数减少了,最大为折半判定树的深度。但移动次数不变。不变。 故为故为O(n2)西安科技大学精品课程西安科技大学精品课程第第7 7章章 图图 void BinSort (RecordType r , int length)/*对记录数组对记录数组r进行折半插入排序,进行折半插入排序, length为数组的长度为数组的长度*/ for (i=2; i=length; +i) x= ri; low=1; high=i-1; while(low=high) /* 确定插入位置确定插入位
21、置 */ mid=(low+high) / 2; if(x.key= low; -j ) rj+1= rj; /* 记录依次向后移动记录依次向后移动 */ rlow=x; /* 插入记录插入记录 */ 西安科技大学精品课程西安科技大学精品课程第第7 7章章 图图 3 表插入排序表插入排序* 直接插入排序、折半插入排序均要大量移动记录,时间开销直接插入排序、折半插入排序均要大量移动记录,时间开销大。大。 表插入排序是采用链表存储结构进行插入排序的方法。表插入排序是采用链表存储结构进行插入排序的方法。 基本思想:基本思想: 先在待插入记录之前的有序子链表中查找应插入位置,然先在待插入记录之前的有序
22、子链表中查找应插入位置,然后将待插入记录插入链表。后将待插入记录插入链表。 由于链表的插入操作只修改指针域,不移动记录,所以表由于链表的插入操作只修改指针域,不移动记录,所以表插入排序可提高排序效率。插入排序可提高排序效率。 在算法的具体实现上,我们可以采用静态链表作为存储结构。在算法的具体实现上,我们可以采用静态链表作为存储结构。表插入排序示例如图表插入排序示例如图9.5所示。所示。西安科技大学精品课程西安科技大学精品课程第第7 7章章 图图首先给出类型说明如下:首先给出类型说明如下:typedef int KeyType;typedef struct KeyType key; OtherT
23、ype other-data; int next; RecordType1;设设r为用为用RecordType1类型数组表示的静态链表,为了插入方类型数组表示的静态链表,为了插入方便,用便,用r0做为表头结点,并构成循环链表,即做为表头结点,并构成循环链表,即 r0.next指向静指向静态循环链表的第一个结点,态循环链表的第一个结点,rn.next=0。西安科技大学精品课程西安科技大学精品课程第第7 7章章 图图西安科技大学精品课程西安科技大学精品课程第第7 7章章 图图 void SLinkListSort(RecordType1 r, int length) int n=length; r
24、0.next=n; r1.next=0; /*构造只有一个元素的有序静态循环链表构造只有一个元素的有序静态循环链表*/ for(i=2; i=n-1; -i) p= r0.next; q=0; while(p0&rp.keytj,tk=1;ir 做一趟希尔插入排序,做一趟希尔插入排序, delta 为增量为增量*/for(i=1+delta; ilength; i+) /* 1+delta为第一个子序列的第二个元素的下标为第一个子序列的第二个元素的下标 */ if (L-ri.keyri-delta.key) L-r0= L-ri; /* 备份备份ri (不做监视哨不做监视哨) */ for(
展开阅读全文