数据结构内部排序.ppt
《数据结构内部排序.ppt》由会员分享,可在线阅读,更多相关《数据结构内部排序.ppt(81页珍藏版)》请在三一办公上搜索。
1、第10章 内部排序,学习目的与要求:,1.深刻理解排序的定义和各种排序方法的特点,并能加以灵活应用;,2.熟练掌握各种排序方法的执行过程;,3.熟练掌握各种排序方法的时间复杂度的分析方法,从“关键字间的比较次数和记录的移动次数”分析排序算法的平均情况和最坏情况的时间性能;,4.理解排序方法“稳定”或“不稳定”的含义。,基本内容,概述,插入排序,交换排序,选择排序,基数排序,归并排序,各种排序方法的比较,概述,1基本概念,排序:将数据元素(或记录)的一个任意序列,重新排列成一个按关键字有序的序列。,排序方法的稳定性:对关键字相同的数据元素,排序前后它们的领先关系保持不变,则称该排序方法是稳定的;
2、反之,称该排序方法是不稳定的。,内部排序:待排序记录存放在计算机的内存中进行的排序。,外部排序:待排序记录的数量很大,以致内存一次不能容纳全部记录,在排序过程中尚需对外存进行访问的排序。,排序的时间开销:排序的时间开销是衡量算法好坏的最重要的标志。排序的时间开销可用算法执行中的数据比较次数与数据移动次数来衡量。算法运行时间代价的估算一般都按平均情况进行估算。对于那些受记录关键字序列初始排列及记录个数影响较大的,需要按最好情况和最坏情况进行估算。,2排序的分类,按排序过程依据的不同原则进行分类:,交换排序,选择排序,归并排序,计数排序,按工作量进行分类:,先进的排序方法,其时间复杂度为O(nlo
3、g2n),基数排序,基数排序,其时间复杂度为O(dn),3排序的基本操作和记录的存储方式,排序过程中需要的两种基本操作:(1)比较关键字的大小;(2)将记录从一个位置移至另一个位置。,待排序记录序列可有下列三种存储方式:(1)记录存放在一组连续的存储单元中;类似于线性表的顺序存储结构,记录次序由存储位置决定,实现排序需移动记录。(2)记录存放在静态链表中;记录次序由指针指示,实现排序不需移动记录,仅需修改指针。链排序(3)记录本身存放在一组连续的存储单元中,同时另设指示各个记录存储位置的地址向量,排序过程中不移动记录本身,而移动地址向量中相应记录的地址。排序结束后再根据地址调整记录的存储位置。
4、地址排序,4待排序记录的数据类型,#define MAXSIZE 20typedef struct int key;InfoType otherinfo;RedType;typedef struct RedType rMAXSIZE+1;/0单元作为哨兵 int length;SqList;,基本内容,概述,插入排序,交换排序,选择排序,基数排序,归并排序,各种排序方法的比较,插入排序,直接插入排序,插入排序的基本思想是:每步将一个待排序的记录,按其关键字大小,插入到前面已经排好序的一组记录的适当位置上,直到记录全部插入为止。,折半插入排序,2-路插入排序,表插入排序,希尔排序,插入排序,1直
5、接插入排序,基本思想:当插入第i(i 1)个记录时,前面的r1,r2,ri-1已经排好序。这时,用ri的关键字与ri-1,ri-2,的关键字顺序进行比较,找到插入位置即将ri插入,原来位置上之后的所有记录依次向后顺移。,例,49 38 65 97 76 13 27,(),i=2 38(38 49)65 97 76 13 27,i=3 65(38 49 65)97 76 13 27,i=4 97(38 49 65 97)76 13 27,i=5 76(38 49 65 76 97)13 27,i=6 13(13 38 49 65 76 97)27,i=7(13 38 49 65 76 97)27
6、,97,27,76,65,49,38,排序结果:(13 27 38 49 65 76 97),直接插入排序的算法,void InsertSort(SqList/记录插入/InsertSort,时间复杂度:T(n)=O(n),结论:,空间复杂度:S(n)=O(1),直接插入排序是一个稳定的排序方法。,2折半插入排序,基本思想:利用直接插入排序的思想,只是在排序过程中,为减少查找次数,对已排好序的序列 r1,r1,ri-1,利用折半查找法寻找 ri 的插入位置。,例(30)13 70 85 39 42 6 20,i=2 13(13 30)70 85 39 42 6 20,.,i=7 6(6 13
7、30 39 42 70 85)20,i=8 20(6 13 20 30 39 42 70 85),算法描述如下:,void Bin_InsertSort(SqList/记录插入/Bin_InsertSort,算法分析,折半插入排序减少了关键字间的比较次数(由O(n)下降到O(nlog2n)。,折半插入排序的记录移动次数仍为O(n)。,折半插入排序的时间复杂度仍为O(n),空间复杂度仍为O()。,折半插入排序是一个稳定的排序方法。,32-路插入排序,基本思想:利用直接插入排序的思想,只是在排序过程中,为减少记录的比较和移动次数,但需要n个记录的辅助空间。其做法是:另设一个和L.r同类型的数组D,
8、首先将L.r1赋给D.r1,并将D.r1看成是在排好序的序列中处于中间位置的记录,然后从L.r中第二个记录起依次到D.r1之前或之后的有序序列中。,例 30 13 70 85 39 42 6 20,排序过程中D的状态变化如下:,i=1(30),i=2(30)13,30 13 70 85 39 42 6 20,i=3(30)70 13,i=4(30)70 85 13,i=5(30)39 70 85 13,i=6(30)39 42 70 85 13,i=7(30)39 42 70 85 6 13,i=8(30)39 42 70 85 6 13 20,算法描述如下:,void Two_InsertS
9、ort(SqList L,SqList,for(k=first;k=high+1;k+)D.rk+1=D.rk;D.rhigh+1=L.ri;fianl+;/for/Two_InsertSort,算法分析,2-路插入排序减少了关键字间的比较次数(小于nlog2n)。,2-路插入排序减少了记录移动次数,约为n2/8。,2-路插入排序的时间复杂度仍为O(n),但空间复杂度为O(n)。,2-路插入排序是一个稳定的排序方法。,4表插入排序,表插入排序采用了静态链表的存储结构,其排序过程如下:首先将静态链表中数组下标为1的分量(结点)和表头结点构成一个循环链表,然后依次将下标为2至n的分量(结点)按记录
10、关键字非递减有序插入到循环链表中。,表插入排序的基本操作仍是将一个记录插入到已排好序的有序表中。和直接插入排序相比,不同之处仅是以修改2n次指针值代替移动记录,排序过程中所需进行的关键字间的比较次数相同。因此,表插入排序的时间复杂度仍是O(n2)。,5希尔排序,希尔排序方法又称为“缩小增量”排序。,基本思想:先将整个待排序记录序列分割成若干子序列分别进行直接插入排序,待整个序列“基本有序”时,再对全体记录进行一次直接插入排序。,算法描述如下:,void ShellInsert(SqList,void ShellSort(SqList,希尔排序算法分析,子序列的构成不是简单的“逐段分割”,而是将
11、相隔某个增量的记录组成一个子序列;,希尔排序可提高排序速度,因为关键字较小的记录跳跃式前移,在进行最后一趟增量为1的插入排序时,序列已基本有序;,增量序列取法有多种:1)没有除1以外的公因子 2)最后一个增量值必须为1,时间复杂度是所取增量序列的函数,但至今没人能够给出完整的数学分析。,希尔排序是一个不稳定的排序方法。,基本内容,概述,插入排序,交换排序,选择排序,基数排序,归并排序,各种排序方法的比较,交换排序,起泡排序(Bubble Sort),交换排序的基本思想是:两两比较待排序记录的关键字,若两条记录的次序相反则进行交换,直到没有反序的记录为止。,快速排序(Quick Sort),交换
12、排序,1起泡排序(Bubble Sort),基本过程:1)将第一个记录的关键字与第二个记录的关键字进行比较,若为逆序r1.keyr2.key,则交换;然后比较第二个记录与第三个记录;依次类推,直至第n-1个记录和第n个记录比较为止第一趟冒泡排序,结果关键字最大的记录被安置在最后一个记录上;2)对前n-1个记录进行第二趟冒泡排序,结果使关键字次大的记录被安置在第n-1个记录位置;3)重复上述过程,直到“在一趟排序过程中没有进行过交换记录的操作”为止。,例:49 38 38 38 38 13 13 38 49 49 49 13 27 27 65 65 65 13 27 38 38 97 76 13
13、 27 49 49 76 13 27 49 49 13 27 49 65 27 49 76 49 97,初始关键字,第一趟排序后,第二趟排序后,第三趟排序后,第四趟排序后,第五趟排序后,第六趟排序后,算法分析,T(n)=O(n),空间复杂度:S(n)=O(1),起泡排序是一个稳定的排序方法,2快速排序(Quick Sort),对冒泡排序的一种改进,基本思想:通过一趟排序将待排序记录分割成独立的两部分,其中一部分的关键字均比另一部分的关键字小,则可分别对这两部分记录继续分别进行排序,以达到整个序列有序。,排序过程:,1)初始时令i=s,j=t;2)首先从j所指位置向前搜索第一个关键字小于pivo
14、t的记录,并和rp交换;3)再从i所指位置起向后搜索,找到第一个关键字大于pivot的记录,和rp交换;4)重复上述两步,直至i=j为止;(此时整个序列被分成有序的前后两块)5)再分别对两个子序列进行快速排序,直到每个子序列只含有一个记录为止。,对rst中记录进行一趟快速排序,附设两个指针i和j,设枢轴记录rp=rs,pivot=rp.key,快速排序举例,初始关键字:49,38,65,97,76,13,27,49,一趟完成后:27,38,13,49,76,97,65,49,一趟完成后:27,38,13,49,76,97,65,49,分别进行快速排序:13 27 38 49 49 65 76
15、97,快速排序结束:13 27 38 49 49 65 76 97,快速排序算法描述:,int Partition(SqList,void Qsort(SqList/QuickSort,快速排序算法分析,在n个元素的序列中,对一个记录定位所需时间为 O(n)。若设 T(n)是对 n 个元素的序列进行排序所需的时间,而且每次对一个记录正确定位后,正好把序列划分为长度相等的两个子序列,此时,总的计算时间为:T(n)cn+2 T(n/2)/c是一个常数 cn+2(cn/2+2T(n/4)=2cn+4T(n/4)2cn+4(cn/4+2T(n/8)=3cn+8T(n/8)cn log2n+nT(1)=
16、O(n log2n),快速排序的平均时间是O(nlogn),在所有同数量级(O(nlogn)的排序方法中,就平均计算时间而言,快速排序是我们所讨论的所有内部排序方法中最好的一个。,快速排序需要一个栈空间来实现递归,若每趟排序都将记录序列均匀地分割成长度相接近的两个子序列,则栈的最大深度为O(logn)。,若初始序列按关键字基本有序(最坏情况),快速排序蜕化为起泡排序,其时间复杂度为O(n2),最坏情况下栈的深度为n。,改进的方法,用“三者取中”的法则选取枢轴记录(pivotkey)。,快速排序是一种不稳定的排序方法。,对于 n 较大的平均情况而言,快速排序是“快速”的,但是当 n 很小时,这种
17、排序方法往往比其它简单排序方法还要慢。,基本内容,概述,插入排序,交换排序,选择排序,基数排序,归并排序,各种排序方法的比较,选择排序,选择排序(Selection Sort)的基本思想是:每一趟从待排序的记录中选出关键字最小的记录,顺序放在已排好序的子文件的最后,直到全部记录排序完毕。,简单选择排序(Select Sort),树形选择排序(Tree Selection Sort),堆排序(Heap Sort),选择排序,1简单选择排序(Select Sort),基本步骤:对长度为n的待排序序列进行简单选择排序需要经过n-1趟排序。第i 趟的排序过程为:在一组记录rirn(i=1,2,n-1)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 内部 排序

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