算法与数据结构语言第8章排序幻灯片.ppt
《算法与数据结构语言第8章排序幻灯片.ppt》由会员分享,可在线阅读,更多相关《算法与数据结构语言第8章排序幻灯片.ppt(84页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、算法与数据结构语言第8章排序第1页,共84页,编辑于2022年,星期一目录n8.1基本概念基本概念n8.2插入排序插入排序n8.2.1直接插入排序直接插入排序n8.2.2二分法插入排序二分法插入排序n8.2.3表插入排序表插入排序n8.2.4Shell排序排序n8.3 选择排序选择排序n8.3.1直接选择排序直接选择排序n8.3.2堆排序堆排序nn8.4交换排序交换排序n8.4.1起泡排序起泡排序n8.4.2快速排序快速排序n8.5 分配排序分配排序n8.5.1概述概述n8.5.2基数排序基数排序n8.6归并排序归并排序n8.6.1内排序内排序n8.6.2外排序外排序*第2页,共84页,编辑于
2、2022年,星期一8.1基本概念基本概念排序的对象是由一组记录组成的文件,每个记录由若干字段组成,所谓排排序序码码是记录中的一个(或多个)字段,排序以排序码为依据。排序码可以不是关键码,则可能有多个记录具有相同的排序码,使得排序的结果不唯一。排序码之间需要进行比较,本章中都假设排序码为整型。设R0,R1,Rn-1是由n个记录组成的文件,K0,K1,Kn-1是排序码集合,所谓排排序序就是将文件中的全部记录按排序码不增(或不减)的次序重新排列。第3页,共84页,编辑于2022年,星期一排序看成字典上的操作n在排序的讨论中,并不关心被排序对象本身的逻辑结构,所以读者可以把排序看成是字典上的一种操作。
3、n不同的排序算法,可能依赖与不同的存储结构,可以理解为在字典的不同存储表示上排序的实现。n而把非字典结构中元素的排序,归结为是对于其结点按照排序码建立的密集索引的排序。n与上一章关于索引的讨论类似,在本章的具体排序算法中,只关心排序码的作用和表示,而把记录中的其它字典隐藏起来。n第4页,共84页,编辑于2022年,星期一在待排序的文件中,如果存在多个排序码相同的记录,经过排序后,相同排序码记录的相对次序如果保持不变,则称这种排序方法是稳定稳定的,否则是不稳定的。稳定性稳定性第5页,共84页,编辑于2022年,星期一本章中提到的记录和文件,主要是指内存的数据。待排序的记录在排序过程中全部存放在内
4、存的称为内排序内排序,否则称为外排序外排序。外排序也就是外存文件的排序。本章讨论的主要是内排序的方法,但有些方法(例如归并排序)也适用于外排序。内排序与外排序内排序与外排序第6页,共84页,编辑于2022年,星期一排序方法分类排序方法分类插入排序、选择排序、交换排序、分配排序、归并排序。(每一种方法具体可能有多个不同算法)第7页,共84页,编辑于2022年,星期一评价排序算法代价的标准n第一,执行算法所需的时间;比较次数、移动次数n第二,执行算法所需要的附加空间;n另外,算法本身的复杂程度也是比较算法一个因素。第8页,共84页,编辑于2022年,星期一8.2插入排序插入排序基本方法是每步将一个
5、待排序的记录,按其排序码大小,插到前面已经排序的文件中的适当位置,直到全部插入完为止。第9页,共84页,编辑于2022年,星期一n直接插入排序n二分法插入排序n表插入排序nshell排序第10页,共84页,编辑于2022年,星期一8.2.1直接插入排序n假设待排序的假设待排序的n个记录个记录R0,R1,Rn-1顺序存放顺序存放在数组中,直接插入法在插入记录在数组中,直接插入法在插入记录Ri(i=1,2n-1)时,记录集合被划分为两个区间时,记录集合被划分为两个区间R0,Ri-1和和Ri,Rn-1,其中,前一个子区间已经排好序,后一个,其中,前一个子区间已经排好序,后一个子区间是当前未排序的部分
6、,将排序码子区间是当前未排序的部分,将排序码Ki与与Ki-1,Ki-2,K0依次比较,找出应该插入的位置,将记依次比较,找出应该插入的位置,将记录录Ri插入。插入。n直接插入排序采用顺序存储结构。直接插入排序采用顺序存储结构。第11页,共84页,编辑于2022年,星期一n例题设待排序的记录共8个,排序码分别为49,38,65,97,76,13,27,49,请用直接插入排序法排序(为了区别两个相同的排序码49,后面的49用49表示)。第12页,共84页,编辑于2022年,星期一初始序列4938659776132749i=13849659776132749i=23849659776132749i=
7、33849659776132749i=43849657697132749i=51338496576972749i=61327384965769749i=71327384949657697第13页,共84页,编辑于2022年,星期一typedef int KeyType;typedef int DataType;typedef struct KeyType key;/*排序码字段*/DataType info;/*记录的其它字段*/RecordNode;typedef struct int n;/*n为文件中的记录个数*/RecordNode *record;SortObject;存储结构存储结
8、构第14页,共84页,编辑于2022年,星期一n程序实现:voidinsertSort(SortObject*pvector)n若文件初态为正序,则算法的时间复杂度为O(n),若初态为反序,则时间复杂度为O(n2)。n平均移动次数与平均比较次数同级,是O(n2)。直接插入排序的平均时间复杂度为T(n)=O(n2)。n算法中引入了一个附加的记录空间temp,因此辅助空间为S(n)=O(1)。n直接插入排序是稳定的。算法的设计与分析算法的设计与分析第15页,共84页,编辑于2022年,星期一8.2.2二分法插入排序n在直接插入排序的基础上减少比较的次数,即在插入Ri时改用二分法比较找插入位置,便得
9、到二分法插入二分法插入排序。第16页,共84页,编辑于2022年,星期一(1)13 273849657697 49(2)1327384965 7697 49(3)1327384965 769749(4)13 27 384949 65 76 97二分法插入排序示例二分法插入排序示例第17页,共84页,编辑于2022年,星期一n二分法插入排序必须采用顺序存储方式,存储结构的定义同上一节的SortObject。程序实现存储结构与算法第18页,共84页,编辑于2022年,星期一代价分析代价分析n二分法插入排序的比较次数与待排序记录的初始状态无关,仅依赖于记录的个数。n插入第i个记录时,如果i=2j(0
10、j),则恰好经过j=log2i次比较;如果2ji2j+1,则比较次数为j+1。n排序的总比较次数为n=0+1+2+2+k+k+k(20个1,21个2,2k-1个k)=1+2+22+2k-1+2+22+2k-1+22+2k-1=k2k2k+1=nlog2nn+1nlog2n第19页,共84页,编辑于2022年,星期一n算法8.2的移动次数与算法8.1的相同,最坏的情况为n2/2,最好的情况为2n,平均移动次数为O(n2)。n二分法插入排序算法的平均时间复杂度为T(n)=O(n2)。n算法中增加了一个辅助空间temp,因此,算法的辅助空间为S(n)=O(1)。n二分法插入排序是稳定的。代价分析代价
11、分析第20页,共84页,编辑于2022年,星期一8.2.3表插入排序n表插入排序表插入排序的目标是在直接插入排序的基础上减少记录移动的次数,其基本思想是在每个记录中增加一个指针字段,指向下一个记录。整个被排序的文件表示成一个记录的单链表。n插入记录Ri时,记录R0至Ri-1已经排序,为了确定插入的位置,可以先将记录Ri脱链,再采用顺序比较的方法找到Ri应插入的位置,像单链表的插入那样,将Ri插入链表。第21页,共84页,编辑于2022年,星期一n例题初始序列为49,38,65,97,76,13,27,49,请用表插入排序法排序。图7.3表插入排序示例第22页,共84页,编辑于2022年,星期一
12、n表插入排序必须采用链接存储方式structNode;/*单链表结点类型*/typedefstructNodeListNode;structNodeKeyTypekey;/*排序码字段*/DataTypeinfo;/*记录的其它字段*/ListNode*next;/*记录的指针字段*/;typedefListNode*LinkList;表插入排序的程序实现:voidlistSort(LinkList*plist)存储结构与算法的实现存储结构与算法的实现第23页,共84页,编辑于2022年,星期一n表插入排序时,每插入一个记录,最大比较次数等于表中已排序的记录个数;最小比较次数为1。总比较次数最
13、大为最小为n-1nn表插入排序时记录移动的次数为0,但算法的比较次数与直接插入排序的比较次数同级。n平均时间复杂度为T(n)=O(n2)。n表插入排序是稳定的。代价分析代价分析第24页,共84页,编辑于2022年,星期一8.2.4 Shell排序nShell排序排序的方法又称缩小增量法缩小增量法,是对直接插入排序法的改进。n具体作法是先取一个整数d1n,把全部记录分成d1个组,所有距离为d1倍数的记录放在一组中,先在各组内排序;然后取d2recordp;intchild=2*p+1;while(childsize)if(childrecordchild.keypvector-recordchi
14、ld+1.key)child+;/*选择比较小的子结点选择比较小的子结点*/if(temp.keypvector-recordchild.key)pvector-recordp=pvector-recordchild;/*将将小的子结点上移小的子结点上移*/p=child;child=2*p+1;elsebreak;/*调整结束调整结束*/pvector-recordp=temp;/*将将temp放入正确位置放入正确位置*/第41页,共84页,编辑于2022年,星期一voidheapSort(SortObject*pvector)inti,n;RecordNodetemp;n=pvector-
15、n;for(i=n/2-1;i=0;i-)sift(pvector,n,i);/*建立初始堆建立初始堆*/for(i=n-1;i0;i-)/*进行进行n-1趟堆排序趟堆排序*/temp=pvector-record0;pvector-record0=pvector-recordi;pvector-recordi=temp;sift(pvector,i,0);/*重新调整建堆,注意重新调整建堆,注意i在控制调整范围中的作用在控制调整范围中的作用*/第42页,共84页,编辑于2022年,星期一n初始序列为26,5,77,1,61,11,59,15,48,19,请用(大根)堆排序法排序。排序过程中堆
16、的主要变化在图8.6中给出。排好序后的关键码序列为:1,5,11,15,19,26,48,59,61,77。例例:第43页,共84页,编辑于2022年,星期一第44页,共84页,编辑于2022年,星期一第45页,共84页,编辑于2022年,星期一n堆排序的时间耗费主要在构造初始堆,以及排序过程中不断将“去掉”最小元素后的元素重新建堆两部分上。n初始建堆总的比较次数C1(n)4nO(n)n排序过程中每去掉一个元素都需要重新建堆。n总共排序过程中重新建堆比较花费的次数C2(n)2nlog2n=O(nlog2n)n整 个 堆 排 序 中 总 的 比 较 次 数 为 C(n)=C1(n)+C2(n)=
17、O(n*log2n)。n而结点移动的次数小于比较的次数,因此总的时间花费T(n)=O(n*log2n)。n堆排序是不稳定的代价分析代价分析第46页,共84页,编辑于2022年,星期一8.4交换排序交换排序n交换排序交换排序的基本方法是两两比较待排序记录的排序码,交换不满足顺序要求的偶对,直到全部满足为止。本节介绍起泡排序和快速排序。第47页,共84页,编辑于2022年,星期一8.4.1起泡排序n起泡排序起泡排序的方法是先将序列中的第一个记录R0与第二个记录R1比较,若前者大于后者,则两个记录交换位置,否则不交换;然后对新的第二个记录R1与第三个记录R2作同样的处理;依次类推,直到处理完第n-1
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 算法 数据结构 语言 排序 幻灯片
限制150内