数据结构讲义第10章..ppt





《数据结构讲义第10章..ppt》由会员分享,可在线阅读,更多相关《数据结构讲义第10章..ppt(54页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第十章第十章 内部排序内部排序 信息查找是信息系统的最主要的操作。如何信息查找是信息系统的最主要的操作。如何在大量信息中快速找到所需要的信息一直是信息在大量信息中快速找到所需要的信息一直是信息查找所追求的目标。如果数据是按照某种合理的查找所追求的目标。如果数据是按照某种合理的顺序进行存储,则查找将是最有效的。顺序进行存储,则查找将是最有效的。排序就是使数据有序的一种基本操作,是组排序就是使数据有序的一种基本操作,是组织数据的最基本运算,织数据的最基本运算,采用更有效的排序方法,采用更有效的排序方法,能很好地提高计算机的效率。能很好地提高计算机的效率。10.1 10.1 基本基本概念概念1 1、
2、排序、排序 排排序序:设设R1,R2,.,Rn是是n n个个记记录录的的序序列列,其其相相应应的的关关键键 字字 为为 K1,K2,Kn。需需 确确 定定 1,2,n的的 一一 种种 排排 列列p1,p2,pn,使其相应满足下面的非递减使其相应满足下面的非递减(或非递增或非递增)关系:关系:Kp1Kp2.Kpn使上面使上面n n个记录的序列成为一个按关键字有序的序列个记录的序列成为一个按关键字有序的序列 Rp1,Rp2,.,Rpn这样一种操作称为排序。这样一种操作称为排序。即即排排序序是是一一个个将将记记录录关关键键字字无无序序的的序序列列调调整整为为一一个个按按关关键字有序键字有序(递增(非
3、递减递增(非递减)、递减、递减(非递增非递增)的记录序列。的记录序列。用用于于排排序序的的关关键键字字Ki:可可以以是是记记录录的的主主关关键键字字,也也可可以以是次关键字,甚至还可以是若干数据项的集合。是次关键字,甚至还可以是若干数据项的集合。若是主关键字,则排序的结果是唯一的。若是主关键字,则排序的结果是唯一的。若是次关键字,排序结果不唯一。若是次关键字,排序结果不唯一。基本基本概念概念2 2、排序的稳定性:、排序的稳定性:假假设设Ki=Kj,ij,且且在在排排序序前前的的序序列列中中Ri领领先先Rj(即即ij),若若在在排排序序后后的的序序列列中中,Ri仍仍领领先先Rj,则则称称所所用用
4、的的排排序方法是稳定的。序方法是稳定的。若若在在排排序序后后的的序序列列中中,Rj领领先先Ri,则则称称所所用用的的排排序序方方法是不稳定的。法是不稳定的。排排序序算算法法的的稳稳定定性性是是指指对对所所有有输输入入实实例例而而言言,只只要要能能找找出一个实例能证明其是不稳定的,就能说明它是不稳定的。出一个实例能证明其是不稳定的,就能说明它是不稳定的。3、内排序:排序期间,全部记录都存放在内存。、内排序:排序期间,全部记录都存放在内存。外外排排序序:排排序序期期间间,只只有有部部分分记记录录在在内内存存,随随时时存存在在记录的内外存交换。记录的内外存交换。基本基本概念概念 4 4、排序过程进行
5、的操作:、排序过程进行的操作:比较操作:比较两个关键字的大小比较操作:比较两个关键字的大小-必不可少的操作。必不可少的操作。改改变变记记录录的的逻逻辑辑联联系系或或将将一一个个记记录录从从一一个个位位置置移移动动到到另另一个位置。一个位置。是否需要移动,与待排序记录的存储方式有关:是否需要移动,与待排序记录的存储方式有关:以以顺顺序序表表作作为为存存储储结结构构:当当两两个个记记录录关关键键字字不不满满足足给给定定关系时,必须移动记录。关系时,必须移动记录。以以链链表表作作为为存存储储结结构构,通通过过修修改改指指针针来来改改变变记记录录的的逻逻辑辑关系,不需移动记录。通常这种排序为链表排序。
6、关系,不需移动记录。通常这种排序为链表排序。若若存存储储在在一一组组地地址址连连续续的的存存储储单单元元中中,另另设设一一地地址址向向量量来来指指示示各各记记录录的的存存储储位位置置。排排序序过过程程中中通通过过移移动动地地址址向向量量中中的的记记录录的的“地地址址”来来改改变变记记录录的的次次序序关关系系。(排排序序完完成成后后再再调整记录的存储位置,这种存储方式的排序称为地址排序。)调整记录的存储位置,这种存储方式的排序称为地址排序。)基本基本概念概念5 5、评价排序算法的标准:、评价排序算法的标准:执行时间;执行时间;所需辅助空间。所需辅助空间。若若所所需需辅辅助助空空间间不不依依赖赖于
7、于问问题题的的规规模模n n,即即辅辅助助空空间间为为O(1)O(1),则则称称为为就就地地排排序序。非非就就地地排排序序所所要要求求的的辅辅助助空空间间为为O(n)O(n)。排排序序算算法法的的时时间间开开销销主主要要是是关关键键字字的的比比较较次次数数和和记记录录的的移移动动次次数数。算算法法执执行行时时间间不不仅仅取取决决于于问问题题的的规规模模,而而且且取取决决于于输输入入实实例例中中的的数数据据状状态态,分分析析中中一一般般给给出出最最好好、最最坏坏和平均的三种时间性能评价。和平均的三种时间性能评价。本本章章所所讨讨论论的的排排序序,除除基基数数排排序序外外,都都是是采采用用顺顺序序
8、表表作作为存储结构。为存储结构。基本基本概念概念为了讨论方便,假设记录关键字均为整数。为了讨论方便,假设记录关键字均为整数。待排序的记录的数据类型为:待排序的记录的数据类型为:#define n 100 typedef int KeyType;typedef struct KeyType key;InfoType otherinfo;RecType;typedef RecType SeqListn+1;若若关关键键字字类类型型没没有有比比较较算算符符,可可事事先先定定义义宏宏或或函函数数来来表表示比较算符。如字符串比较。示比较算符。如字符串比较。10.2 10.2 插入排序插入排序一、插插入入
9、排排序序算算法法的的基基本本思思想想:先先将将第第一一个个记记录录看看作作一一个个有有序序子子表表,然然后后依依次次从从第第二二个个记记录录开开始始逐逐个个将将记记录录插插入入到前面的有序子表中。到前面的有序子表中。二、直接插入排序二、直接插入排序-线性插入排序线性插入排序假假设设:待待排排序序记记录录放放在在数数组组R1.n中中。把把数数组组中中记记录录分分成成两两个个区区R1.i-1和和Ri.n,其其中中R1.i-1为为有有序序区区,Ri.n为为无无序序区区。然然后后把把无无序序区区中中记记录录依依次次插插入入到到有有序序区区中中形形成成新新的的有有序序区区。这这种种方方法法通通常常称称为
10、为增增量量法法,因因为为每每次次在在有有序序区中增加一个新记录。区中增加一个新记录。初初始始时时,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处处设设置置监监视视哨哨。即令:即令:R0=RiR0=Ri这这 样样,在在 向向 前前 搜搜 索索 过过 程程 中中,总
11、总 有有 一一 个个 记记 录录 有有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),),65,97,76,13,27,49 i=3 (65)()(38,49,65),),97,76,1
12、3,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)int i,j;for(i=2;i=L.length;+i)/对每一个对每一个RiR if LT(L.ri.key,L.r
13、i-1.key)L.r0=L.ri;for (j=i-1;LT(L.r0.key,L.rj.key);-j)/寻找插入位置寻找插入位置j L.rj+1=L.rj;/将将j.i-1 的记录后移一格的记录后移一格 L.rj+1=L.r0;/将将Ri插入到位值插入到位值j 直接插入排序直接插入排序算法分析:算法分析:空间分析:需要一个记录的辅助空间。空间分析:需要一个记录的辅助空间。时间分析:时间分析:、若若记记录录关关键键字字已已按按非非递递减减排排列列,每每趟趟排排序序插插入入,只只需需进进行行一一次次关关键键字字比比较较,则则总总的的比比较较次次数数为为n-1n-1。算算法法时时间间复杂度为复
14、杂度为O(n)O(n)。、若若关关键键字字已已按按非非递递增增排排列列,则则对对第第i i个个记记录录进进行行查查找找插入时插入时,要比较要比较i i次次,移动移动i+1i+1个记录。则总的比较次数为个记录。则总的比较次数为 i=i=(n+2n+2)(n-1)/2=(n(n-1)/2=(n2 2+n-2)/2 (i=2.n)+n-2)/2 (i=2.n)移动记录数为移动记录数为(i+1)=(n+4)(n-1)/2=(ni+1)=(n+4)(n-1)/2=(n2 2+3n-4)/2+3n-4)/2平均比较次数平均比较次数=(=(n n2 2+n-2)/2+n-1)/2=n+n-2)/2+n-1)
15、/2=n2 2/4+3n/4-1n/4+3n/4-1n2 2/4/4平均移动次数平均移动次数=(=(n n2 2+3n-4)/2+2(n-1)/2+3n-4)/2+2(n-1)/2 =n =n2 2/4+7n/4-2n/4+7n/4-2n2 2/4/4 则直接插入排序的时间复杂度为则直接插入排序的时间复杂度为O(nO(n2 2)直接插入排序为稳定的排序方法。直接插入排序为稳定的排序方法。折半插入排序折半插入排序方方法法:先先利利用用折折半半查查找找方方法法来来确确定定插插入入位位置置,然然后后向向后后移动元素进行插入。移动元素进行插入。优点:比较次数少,但移动元素个数相同。优点:比较次数少,但
16、移动元素个数相同。void BinaryInsertSort(SeqLiat&L)for(i=2;i=L.length;i+)/共进行共进行n-1n-1次插入次插入 L.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 mothod)也称也称“缩小增量排序缩小增量排序”。直直接接插插入入排排序序:若若待待排排记记录录为为“正正序序”时时,时时间间复复杂杂度度为
17、为O(n),O(n),即即:待排记录基本有序时,效率高;待排记录基本有序时,效率高;当当n n很小时,效率也很高。很小时,效率也很高。希希尔尔排排序序正正是是针针对对这这两两个个特特点点对对直直接接插插入入排排序序进进行行改改造造的一种插入排序方法。的一种插入排序方法。基基本本思思想想:先先将将整整个个待待排排记记录录分分割割成成若若干干个个子子序序列列分分别别进进行行直直接接插插入入排排序序。待待整整个个序序列列基基本本有有序序时时,再再对对全全部部记记录进行一次直接插入排序。录进行一次直接插入排序。分分割割方方法法:选选定定一一个个记记录录的的间间隔隔值值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
19、 55 04 49 38 65 97 76对各组直接排序后得到对各组直接排序后得到:(其中移动记录(其中移动记录2次)次)13 04 4 9 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 克努特的取法:克努特的取法:d
20、i+1=di DIV 3 其他:其他:dk=2t-k+1-1 t为排序躺数为排序躺数=(int)(log2n+1)n=10,t=3,di=7,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
21、+1;i0<(L.r0.key,L.rj.key);j-=dk)L.rj+dk=L.rj;L.rj+dk=L.r0;希尔插入排序希尔插入排序算法分析:算法分析:当增量序列为当增量序列为dk=2t-k+1-1时,时间复杂都为时,时间复杂都为O(n3/2)。根据经验统计,根据经验统计,shellshell排序所需比较和移动次数约为排序所需比较和移动次数约为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
23、 38 49 49 657697交换排序交换排序 结结束束标标志志:若若某某遍遍处处理理无无数数据据交交换换,说说明明已已排排序序好好,可可提前结束。提前结束。若若为为正正序序,则则只只需需进进行行一一趟趟排排序序,只只进进行行n-1n-1次次关关键键字字比较,无记录移动。比较,无记录移动。若若为为逆逆序序,则则需需进进行行n-1n-1趟趟排排序序,需需进进行行n(n-1)/2n(n-1)/2次次比比较,并做等数量级的记录移动,算法时间复杂度为较,并做等数量级的记录移动,算法时间复杂度为O(nO(n2 2).).算算法法中中可可设设置置一一开开关关变变量量switchswitch,每每遍遍处处
24、理理开开始始时时,令令其为其为FALSE,该遍若有数据交换,则置成该遍若有数据交换,则置成TRUE。交换排序交换排序 算法描述:算法描述: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、具具体
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 讲义 10

限制150内