数据结构ppt课件.ppt
《数据结构ppt课件.ppt》由会员分享,可在线阅读,更多相关《数据结构ppt课件.ppt(64页珍藏版)》请在三一办公上搜索。
1、第9章 排序,9.1 排序的基本概念9.2 简单排序方法 9.3 先进排序方法 9.4 各种排序方法的综合比较 9.5 外排序简介,9.1 排序的基本概念,1. 排序,是按关键字的非递减或非递增顺序对一组记录重新进行排列的操作。描述如下: 假设含有n个记录的序列为 r1,r2,rn 它们的关键字相应为 k1,k2,kn 使其关键字满足如下非递减(或非递增)关系: 也就是使记录序列重新排列成一个按关键字有序的序列,2. 排序的稳定性 假设Ki=Kj(1in,1jn,ij), 若在排序前的序列中Ri领先于Rj(即ij),排序后Ri仍领先于Rj, 称排序方法是稳定的; 若相同关键字的领先关系在排序过
2、程中发生变化,称为不稳定的排序。,证明一种排序方法是稳定的,要从算法本身的步骤中加以证明。 证明排序方法是不稳定的,只需给出一个反例说明,在排序过程中,一般进行两种基本操作: 比较两个关键字的大小; 将记录从一个位置移动到另一个位置。三种常见的存储方法: 向量结构:将待排序的记录存放在一组地址连续的存储单元中。由于在这种存储方式中,记录之间的次序关系由其存储位置来决定,所以排序过程中一定要移动记录才行。 链表结构:采用链表结构时,记录之间逻辑上的相邻性是靠指针来维持的,这样在排序时,就不用移动记录元素,而只需要修改指针。 这种排序方式被称为链表排序。,记录向量与地址向量结合:将待排序记录存放在
3、一组地址连续的存储单元中,同时另设一个指示各个记录位置的地址向量。在排序过程中不移动记录本身,而修改地址向量中的“地址”,排序结束后,再按照地址向量中的值调整记录的存储位置。这种排序方式被称为地址排序。 为了讨论方便,假设待排记录的关键字均为整数,从数组下标为1的位置开始存储,下标为0的位置存储监视哨,或空闲不用。,#define MAXSIZE 20 /*一个用作示例的小顺序表的最大长度*/typedef int KeyType;typedef struct KeyType key; OtherType otherdata; RecordType; typedef struct Record
4、Type rMAXSIZE+1; /*r0闲置或作为判别标志的“哨兵”单元*/ int length; /*顺序表长度*/SqList; /*顺序表类型*/,根据在排序中涉及的存储器不同,将排序方法分为两大类:(1)内部排序:整个排序过程完全在内存中进行。(2)外部排序:由于待排序记录数据量太大,在排序过程中需要对外存进行访问的排序过程。按排序算法的时间复杂度来分,可分为三类:(1)简单的排序方法,其时间复杂度为O(n2);(2)先进的排序方法,其时间复杂度为O(nlogn);(3)基数排序,其时间复杂度为O(d*n)。,9.2.1简单选择排序(selection sort) 在简单选择排序的
5、过程中,待排记录序列的状态为:基本思想: 第i趟排序操作:从无序序列Ri.n的n-i+1记录中选出关键字最小的记录Rj和Ri交换,从而使有序序列区从R1.i-1扩大至R1.i,如图9.1所示。,9.2 简单排序方法,常用的有简单选择排序、插入排序和起泡排序。,一趟简单选择排序算法void SelectPass(SqList *L, int i) RecordType temp; j=i; / *j指示关键字最小记录的位置,初值设为i*/ for(k=i+1; klength; k+) if (L-rk.keyrj.key) j=k; /*暂不进行记录交换,只记录位置*/ if (i!=j) /
6、*最后交换记录Rj和Ri*/ temp =L-rj; L-rj=L-ri; L-ri= temp; /*SelectPass,整个选择排序是一趟选择排序过程的多次重复,其算法如下:void SelectSort (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-r
7、j=L-ri; L-.ri=temp; /*与第i个记录交换*/ /*SelectSort,例如,对下列一组关键字: (491,38,65,492,76,13,27,52),算法分析:时间复杂度:移动次数: 最小 0 最大3(n-1)比较次数:n-1, n-2, n-3,1 时间复杂度为O(n2),空间复杂度为O(1),就选择排序方法本身讲,它是一种稳定的排序方法,但图9.2所表现出来的现象是不稳定的,这是由于上述实现选择排序的算法采用的“交换记录”的策略所造成的,若改变这个策略,可以写出不产生“不稳定现象”的选择排序算法。,9.2.2插入排序 1直接插入排序(insertion sort)
8、基本思想: 在一个已排好序的记录子集的基础上,每一步将下一个待排序的记录有序地插入到已排好序的记录子集中,直到将所有待排记录全部插入为止。 例如:打扑克牌时的抓牌,每抓一张牌,插入到合适位置,直到抓完牌为止,即可得到一个有序序列。,基本操作: 将当前无序序列区Ri.n中的记录Ri“插入”到有序序列区R1.i-1中,i=2,3,n。使有序序列区的长度增1。,例如:对一组关键字序列49,38,65,492,76,13,27,52进行插入排序过程中,每一趟排序之后的状况如图9.4所示。,假设待排序记录存放在r1.n之中。为了提高效率,附设一个监视哨r0,使得r0 存放待插入的记录。 监视哨作用: 一
9、是备份待插入的记录,以便前面关键字较大的记录后移; 二是防止越界。,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起进行。此外,若第i个记录的关键字不小于第i-1个记录的关键字,“插入”也就不需要进行了。,插入排序的算法如下:voi
10、d 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=L-r0; /*插入到正确位置*/ /* if*/ /InsertPass*/,算法性能分析:从空间角度看,需一个辅助空间r0。空间复杂度为S(n)=O(1)。从时间耗费角度看,主要时间耗费在关键字比较和移动元素上。,最好情况:(记录有序) 总的比较次数为n-1次 移动记录的次数也达到
11、最小值2(n-1)最坏情况:(记录逆序) 总的比较次数达到最大值为(n+2)(n-1)/2, 记录移动的次数也达到最大值(n+4)(n-1)/2。,时间复杂度为T(n)=O(n2),直接插入排序是稳定的排序方法。 适用:待排序记录数目较少且基本有序的情况。,2折半插入排序 在有序表中确定插入位置,采用折半查找确定插入位置,即在有序表r1.i-1中用折半查找确定第i个元素的插入位置。,时间复杂度: 比较次数减少了,最大为折半判定树的深度。但移动次数不变。 故为O(n2),void BinSort (RecordType r , int length)/*对记录数组r进行折半插入排序, lengt
12、h为数组的长度*/ for (i=2; i= low; -j ) rj+1= rj; /* 记录依次向后移动 */ rlow=x; /* 插入记录 */ ,3 表插入排序* 直接插入排序、折半插入排序均要大量移动记录,时间开销大。 表插入排序是采用链表存储结构进行插入排序的方法。 基本思想: 先在待插入记录之前的有序子链表中查找应插入位置,然后将待插入记录插入链表。 由于链表的插入操作只修改指针域,不移动记录,所以表插入排序可提高排序效率。 在算法的具体实现上,我们可以采用静态链表作为存储结构。表插入排序示例如图9.5所示。,首先给出类型说明如下:typedef int KeyType;typ
13、edef struct KeyType key; OtherType other-data; int next; RecordType1;设r为用RecordType1类型数组表示的静态链表,为了插入方便,用r0做为表头结点,并构成循环链表,即 r0.next指向静态循环链表的第一个结点,rn.next=0。,void SLinkListSort(RecordType1 r, int length) int n=length; r0.next=n; r1.next=0; /*构造只有一个元素的有序静态循环链表*/ for(i=2; i=n-1; -i) p= r0.next; q=0; whi
14、le(p0 /* 修改指针, 完成插入 */ /* SLinkListSort */ 每插入一条记录,最大的比较次数等于已排好序的记录个数,即当前循环链表长度。所以,总的比较次数为:,4希尔排序(又称缩小增量排序) 较前述直接插入排序方法有较大的改进。,基本思想: 将待排序记录分成若干个子序列,分别进行直接插入排序。 经过上述粗略调整,整个序列中的记录已经基本有序,最后再对全部记录进行一次直接插入排序。,希尔排序为一种不稳定的排序方法,希尔排序方法: 选择一个步长序列t1,t2,tk,其中titj,tk=1;ij; 按步长序列个数k,对序列进行k趟排序; 每趟排序,根据对应的步长ti,将待排序
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 ppt 课件

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