数据结构讲义第10章.优秀PPT.ppt
《数据结构讲义第10章.优秀PPT.ppt》由会员分享,可在线阅读,更多相关《数据结构讲义第10章.优秀PPT.ppt(54页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第十章第十章 内部排序内部排序 信息查找是信息系统的最主要的操作。如何信息查找是信息系统的最主要的操作。如何在大量信息中快速找到所须要的信息始终是信息在大量信息中快速找到所须要的信息始终是信息查找所追求的目标。假如数据是依据某种合理的查找所追求的目标。假如数据是依据某种合理的依次进行存储,则查找将是最有效的。依次进行存储,则查找将是最有效的。排序就是使数据有序的一种基本操作,是组排序就是使数据有序的一种基本操作,是组织数据的最基本运算,接受更有效的排序方法,织数据的最基本运算,接受更有效的排序方法,能很好地提高计算机的效率。能很好地提高计算机的效率。10.1 10.1 基本基本概念概念1 1、
2、排序、排序 排排序序:设设R1,R2,.,RnR1,R2,.,Rn是是n n个个记记录录的的序序列列,其其相相应应的的关关键键 字字 为为 K1,K2,KnK1,K2,Kn。需需 确确 定定 1,2,n1,2,n的的 一一 种种 排排 列列p1,p2,pnp1,p2,pn,使其相应满足下面的非递减,使其相应满足下面的非递减(或非递增或非递增)关系:关系:Kp1Kp2.Kpn Kp1Kp2.Kpn使上面使上面n n个记录的序列成为一个按关键字有序的序列个记录的序列成为一个按关键字有序的序列 Rp1,Rp2,.,Rpn Rp1,Rp2,.,Rpn这样一种操作称为排序。这样一种操作称为排序。即即排排
3、序序是是一一个个将将记记录录关关键键字字无无序序的的序序列列调调整整为为一一个个按按关关键字有序键字有序(递增(非递减递增(非递减)、递减、递减(非递增非递增)的记录序列。的记录序列。用用于于排排序序的的关关键键字字KiKi:可可以以是是记记录录的的主主关关键键字字,也也可可以以是次关键字,甚至还可以是若干数据项的集合。是次关键字,甚至还可以是若干数据项的集合。若是主关键字,则排序的结果是唯一的。若是主关键字,则排序的结果是唯一的。若是次关键字,排序结果不唯一。若是次关键字,排序结果不唯一。基本基本概念概念2 2、排序的稳定性:、排序的稳定性:假假设设Ki=Kj,ijKi=Kj,ij,且且在在
4、排排序序前前的的序序列列中中RiRi领领先先RjRj(即即i ij j),若若在在排排序序后后的的序序列列中中,RiRi仍仍领领先先RjRj,则则称称所所用用的的排排序方法是稳定的。序方法是稳定的。若若在在排排序序后后的的序序列列中中,RjRj领领先先Ri Ri,则则称称所所用用的的排排序序方方法是不稳定的。法是不稳定的。排排序序算算法法的的稳稳定定性性是是指指对对全全部部输输入入实实例例而而言言,只只要要能能找找出一个实例能证明其是不稳定的,就能说明它是不稳定的。出一个实例能证明其是不稳定的,就能说明它是不稳定的。3 3、内排序:排序期间,全部记录都存放在内存。、内排序:排序期间,全部记录都
5、存放在内存。外外排排序序:排排序序期期间间,只只有有部部分分记记录录在在内内存存,随随时时存存在在记录的内外存交换。记录的内外存交换。基本基本概念概念 4、排序过程进行的操作:比较操作:比较两个关键字的大小-必不行少的操作。变更记录的逻辑联系或将一个记录从一个位置移动到另一个位置。是否须要移动,与待排序记录的存储方式有关:以依次表作为存储结构:当两个记录关键字不满足给定关系时,必需移动记录。以链表作为存储结构,通过修改指针来变更记录的逻辑关系,不需移动记录。通常这种排序为链表排序。若存储在一组地址连续的存储单元中,另设一地址向量来指示各记录的存储位置。排序过程中通过移动地址向量中的记录的“地址
6、”来变更记录的次序关系。(排序完成后再调整记录的存储位置,这种存储方式的排序称为地址排序。)基本基本概念概念5 5、评价排序算法的标准:、评价排序算法的标准:执行时间;执行时间;所需协助空间。所需协助空间。若若所所需需协协助助空空间间不不依依靠靠于于问问题题的的规规模模n n,即即协协助助空空间间为为O(1)O(1),则则称称为为就就地地排排序序。非非就就地地排排序序所所要要求求的的协协助助空空间间为为O(n)O(n)。排排序序算算法法的的时时间间开开销销主主要要是是关关键键字字的的比比较较次次数数和和记记录录的的移移动动次次数数。算算法法执执行行时时间间不不仅仅取取决决于于问问题题的的规规模
7、模,而而且且取取决决于于输输入入实实例例中中的的数数据据状状态态,分分析析中中一一般般给给出出最最好好、最最坏坏和平均的三种时间性能评价。和平均的三种时间性能评价。本本章章所所探探讨讨的的排排序序,除除基基数数排排序序外外,都都是是接接受受依依次次表表作作为存储结构。为存储结构。基本基本概念概念为了探讨便利,假设记录关键字均为整数。为了探讨便利,假设记录关键字均为整数。待排序的记录的数据类型为:待排序的记录的数据类型为:#define n 100#define n 100 typedef int KeyType;typedef int KeyType;typedef struct typede
8、f struct KeyType key;KeyType key;InfoType otherinfo;InfoType otherinfo;RecType;RecType;typedef RecType SeqListn+1;typedef RecType SeqListn+1;若若关关键键字字类类型型没没有有比比较较算算符符,可可事事先先定定义义宏宏或或函函数数来来表表示比较算符。如字符串比较。示比较算符。如字符串比较。10.2 10.2 插入排序插入排序一、插入排序算法的基本思想:先将第一个记录看作一个有序子表,然后依次从其次个记录起先逐个将记录插入到前面的有序子表中。二、干脆插入排序-
9、线性插入排序假设:待排序记录放在数组R1.n中。把数组中记录分成两个区R1.i-1和Ri.n,其中R1.i-1为有序区,Ri.n为无序区。然后把无序区中记录依次插入到有序区中形成新的有序区。这种方法通常称为增量法,因为每次在有序区中增加一个新记录。初始时,1个记录自然有序,然后从i=2起先,直到i=n为止,依次将Ri插入到有序区中。干脆插入排序干脆插入排序找找寻寻RiRi的的插插入入位位置置的的方方法法:从从j=i-1j=i-1的的记记录录位位置置起起先先依次向前比较依次向前比较:若若Ri.keyRj.key(j=i-1,i-2,.,1),Ri.key=1j=1,在在R0R0处处设设置置监监视
10、视哨哨。即令:即令:R0=Ri R0=Ri这这 样样,在在 向向 前前 搜搜 寻寻 过过 程程 中中,总总 有有 一一 个个 记记 录录 有有Ri.keyRj.keyRi.keyRj.key。因因此此,引引入入哨哨兵兵元元素素简简化化了了边边界界条条件的推断,使得测试查找循环条件的时间削减一半。件的推断,使得测试查找循环条件的时间削减一半。干脆插入排序干脆插入排序设有一组待排序记录的关键自为:设有一组待排序记录的关键自为:49,38,65,97,76,13,27,49【初始关键字序列为】【初始关键字序列为】(49),),38,65,97,76,13,27,49 i=2 (38)()(38,49
11、),),65,97,76,13,27,49 i=3 (65)()(38,49,65),),97,76,13,27,49 i=4 (97)()(38,49,65,97),),76,13,27,49 i=5 (76)()(38,49,65,76,97),),13,27,49 i=6 (13)(13,38,49,65,76,97),),27,49 i=7 (27)(13,27,38,49,65,76,97),),49 i=8 (49)(13,27,38,49,49,65,76,97)监视哨监视哨干脆插入排序干脆插入排序算法:算法:void InsertSort(SeqLiat&L)void Inse
12、rtSort(SeqLiat&L)int i,j;int i,j;for for(i=2;i=L.length;+i)(i=2;i=L.length;+i)/对每一个对每一个RiRRiR if LT(L.ri.key,L.ri-1.key)if LT(L.ri.key,L.ri-1.key)L.r0=L.ri;L.r0=L.ri;for for (j=i-1;LT(j=i-1;LT(L.r0.key,(L.r0.key,L.rj.key);-j)L.rj.key);-j)/找寻插入位置找寻插入位置j j L.rj+1=L.rj;L.rj+1=L.rj;/将将j.i-1 j.i-1 的记录后移一
13、格的记录后移一格 L.rj+1=L.r0;L.rj+1=L.r0;/将将RiRi插插入到位值入到位值j j 干脆插入排序干脆插入排序算法分析:算法分析:空间分析:须要一个记录的协助空间。空间分析:须要一个记录的协助空间。时间分析:时间分析:、若若记记录录关关键键字字已已按按非非递递减减排排列列,每每趟趟排排序序插插入入,只只需需进进行行一一次次关关键键字字比比较较,则则总总的的比比较较次次数数为为n-1n-1。算算法法时时间间困难度为困难度为O(n)O(n)。、若若关关键键字字已已按按非非递递增增排排列列,则则对对第第i i个个记记录录进进行行查查找找插入时插入时,要比较要比较i i次次,移动
14、移动i+1i+1个记录。则总的比较次数为个记录。则总的比较次数为 i=i=(n+2n+2)(n-1)/2=(n2+n-2)/2 (i=2.n)(n-1)/2=(n2+n-2)/2 (i=2.n)移动记录数为移动记录数为(i+1)=(n+4)(n-1)/2=(n2+3n-4)/2(i+1)=(n+4)(n-1)/2=(n2+3n-4)/2平平 均均 比比 较较 次次 数数=(n2+n-2)/2+n-1)/2=n2/4+3n/4-=(n2+n-2)/2+n-1)/2=n2/4+3n/4-1n2/41n2/4平均移动次数平均移动次数=(n2+3n-4)/2+2(n-1)/2=(n2+3n-4)/2+
15、2(n-1)/2 =n2/4+7n/4-2n2/4 =n2/4+7n/4-2n2/4 则干脆插入排序的时间困难度为则干脆插入排序的时间困难度为O(n2)O(n2)干脆插入排序为稳定的排序方法。干脆插入排序为稳定的排序方法。折半插入排序折半插入排序方方法法:先先利利用用折折半半查查找找方方法法来来确确定定插插入入位位置置,然然后后向向后后移动元素进行插入。移动元素进行插入。优点:比较次数少,但移动元素个数相同。优点:比较次数少,但移动元素个数相同。void BinaryInsertSort(SeqLiat&L)for(i=2;i=L.length;i+)/共进行共进行n-1n-1次插入次插入 L
16、.r0=L.ri;left=1;right=i-1;while(left=right)mid=(left+right)/2;if(L.r0.key=left;j-)L.rj+1=L.rj;/元素后移元素后移L.rleft=L.r0;希尔插入排序希尔插入排序希尔排序(希尔排序(shells mothodshells mothod)也称)也称“缩小增量排序缩小增量排序”。干干脆脆插插入入排排序序:若若待待排排记记录录为为“正正序序”时时,时时间间困困难难度度为为O(n),O(n),即即:待排记录基本有序时,效率高;待排记录基本有序时,效率高;当当n n很小时,效率也很高。很小时,效率也很高。希希尔
17、尔排排序序正正是是针针对对这这两两个个特特点点对对干干脆脆插插入入排排序序进进行行改改造造的一种插入排序方法。的一种插入排序方法。基基本本思思想想:先先将将整整个个待待排排记记录录分分割割成成若若干干个个子子序序列列分分别别进进行行干干脆脆插插入入排排序序。待待整整个个序序列列基基本本有有序序时时,再再对对全全部部记记录进行一次干脆插入排序。录进行一次干脆插入排序。分分割割方方法法:选选定定一一个个记记录录的的间间隔隔值值d d,将将全全部部间间隔隔d d的的记记录录作作为为一一组组。在在组组内内进进行行干干脆脆插插入入排排序序。然然后后缩缩小小间间隔隔,重新分组,再进行组内重新排序,直到间隔
18、为重新分组,再进行组内重新排序,直到间隔为1 1为止。为止。希尔插入排序希尔插入排序例如例如:设待排序列为设待排序列为 49 38 65 97 76 13 27 4 9 55 04按如下方式分组按如下方式分组:49 38 65 97 76 13 27 4 9 55 04dh=5对各组干脆排序后得到对各组干脆排序后得到:13 27 4 9 55 04 49 38 65 97 76共移动记录共移动记录5 5次次希尔插入排序希尔插入排序dh=313 27 4 9 55 04 49 38 65 97 76对各组干脆排序后得到对各组干脆排序后得到:(其中移动记录(其中移动记录2次)次)13 04 4 9
19、 38 27 49 55 65 97 76最终最终,全序列进行一次干脆插入排序得到全序列进行一次干脆插入排序得到:04 13 27 38 4 9 49 55 65 76 97最终移动记录最终移动记录5 5次。共移动记录次。共移动记录1010次。干脆插入排序共移动次。干脆插入排序共移动2727次。次。希尔插入排序希尔插入排序di的取值的取值:希尔提出的取法:希尔提出的取法:d1=n DIV 2 di+1=(di+1)DIV 2 克努特的取法:克努特的取法:di+1=di DIV 3 其他:其他:dk=2t-k+1-1 t为排序躺数为排序躺数=(int)(log2n+1)n=10,t=3,di=7
20、,3,1 算法中,用数组存放每趟分组的间隔。算法中,用数组存放每趟分组的间隔。即:即:d1,d2,.dt 称为增量序列。称为增量序列。希尔插入排序希尔插入排序viod Shellsort(Sqlist&L,int d ,int t)/d0.t-1=.7,3,1 for(k=0;kt;+k)fz_insert_sort(L,dk);/分成分成 dk组干脆排序组干脆排序 void fz_insert_sort(Sqlist&L,int dk);for(i=dk+1;i0<(L.r0.key,L.rj.key);j-=dk)L.rj+dk=L.rj;L.rj+dk=L.r0;希尔插入排序希尔插入
21、排序算法分析:算法分析:当增量序列为当增量序列为dk=2t-k+1-1时,时间困难都为时,时间困难都为O(n3/2)。依据阅历统计,依据阅历统计,shell排序所需比较和移动次数约为排序所需比较和移动次数约为n1.3。当当n时,可削减到时,可削减到n(log2n)2。shell排序是不稳定的排序。排序是不稳定的排序。10.3 10.3 交换排序交换排序一、冒泡排序一、冒泡排序基基本本思思想想:每每次次比比较较相相邻邻元元素素关关键键字字,如如不不符符合合次次序序就就马上进行交换。马上进行交换。若若把把元元素素按按纵纵向向排排列列,在在比比较较和和交交换换的的过过程程中中,关关键键字字值值小小的
22、的记记录录就就象象气气泡泡一一样样逐逐步步往往上上冒冒,而而关关键键字字大大的的记记录录象象石石头头一一样样往往下下沉沉。每每一一次次有有一一块块大大的的石石头头沉沉到到下下面面。所所以称为冒泡排序。以称为冒泡排序。493865977613274938 496576132749 9738 4965132749 769738 491327 49 65769738 13 27 49 49 65769713 27 38 49 49 65769713 27 38 49 49 657697交换排序交换排序 结结束束标标记记:若若某某遍遍处处理理多多数数据据交交换换,说说明明已已排排序序好好,可可提前结束
23、。提前结束。若若为为正正序序,则则只只需需进进行行一一趟趟排排序序,只只进进行行n-1n-1次次关关键键字字比较,无记录移动。比较,无记录移动。若若为为逆逆序序,则则需需进进行行n-1n-1趟趟排排序序,需需进进行行n(n-1)/2n(n-1)/2次次比比较,并做等数量级的记录移动,算法时间困难度为较,并做等数量级的记录移动,算法时间困难度为O(n2).O(n2).算算法法中中可可设设置置一一开开关关变变量量switchswitch,每每遍遍处处理理起起先先时时,令令其为其为FALSEFALSE,该遍若有数据交换,则置成,该遍若有数据交换,则置成TRUETRUE。交换排序交换排序 算法描述:算
24、法描述:viod Bubble_sort(Sqlist&L)for(i=L.length-1;i0;-i)switch=FALSE;for (j=0;ji;+j)if GT(L.rj.key,L.rj+1.key)L.rjL.rj+1;switch=TRUE;if(!switch)break;快速排序快速排序对冒泡排序的一种改进对冒泡排序的一种改进1 1、基基本本思思想想:通通过过一一趟趟排排序序,把把待待排排序序记记录录分分成成独独立立的的两两部部分分。其其中中一一部部分分记记录录的的关关键键字字比比另另一一部部分分记记录录关关键键字字小小。然然后后再再按按上上面面方方式式对对每每一一部部分
25、分进进行行同同样样的的分分割割排排序序,以达到整个序列有序(直到每一部分的记录数为以达到整个序列有序(直到每一部分的记录数为1 1为止)。为止)。2 2、实实现现方方法法:在在待待排排序序记记录录中中先先选选一一记记录录(通通常常选选第第一一个个记记录录)作作为为枢枢轴轴,然然后后将将全全部部关关键键字字小小于于它它的的关关键键字字的的记记录录放放在在它它的的前前面面,将将全全部部关关键键字字较较它它大大的的记记录录放放在在它它的位置之后。的位置之后。3 3、具具体体做做法法:设设待待排排序序记记录录的的范范围围rlowhigh,rlowhigh,附附设设两两个个指指针针i i和和j j,其其
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 讲义 10 优秀 PPT
限制150内