版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、数据结构数据结构(sh j ji u)c语言语言5第一页,共92页。 排序是指将一组数据元素按某个数据项值的大小排列成排序是指将一组数据元素按某个数据项值的大小排列成一个有序序列的过程。一个有序序列的过程。 排序是计算机程序设计中经常使用的一种重要操作,是排序是计算机程序设计中经常使用的一种重要操作,是组织数据和处理数据的最基本最重要的运算之一。组织数据和处理数据的最基本最重要的运算之一。 排序被广泛应用于数据处理、情报检索、商业金融排序被广泛应用于数据处理、情报检索、商业金融(jnrng)(jnrng)等许多领域。等许多领域。 第1页/共92页第二页,共92页。9.6 分配(fnpi)排序(
2、基数排序)第2页/共92页第三页,共92页。1 1记录、关键码和排序表:记录、关键码和排序表: 记录:记录: 数据元素数据元素 关键码(或排序码):作为排序依据的数据项称为数据关键码(或排序码):作为排序依据的数据项称为数据元素的关键码。元素的关键码。 排序表:若干个(排序表:若干个(n n个)排序纪录组成的集合。个)排序纪录组成的集合。 排序表也称成为文件,主要操作是排序。排序表也称成为文件,主要操作是排序。2 2非递减非递减(djin)(djin)序列、递减序列、递减(djin)(djin)序列、非递增序列、非递增序列、递增有序序列、递增有序3 3稳定排序和非稳定排序稳定排序和非稳定排序
3、稳定排序稳定排序 :记录的相对位置在排序前后不发生变化:记录的相对位置在排序前后不发生变化 不稳定排序:不稳定排序:第3页/共92页第四页,共92页。4 4内部排序和外部排序内部排序和外部排序 待排序的表完全放在内存中称为内排序待排序的表完全放在内存中称为内排序5 5对排序方法的评价对排序方法的评价 空间性能:除排序表以外的内存占用情况。空间性能:除排序表以外的内存占用情况。 时间性能:比较关键码的次数,数据移动的次数。时间性能:比较关键码的次数,数据移动的次数。 它们往往它们往往(wngwng)(wngwng)是排序表规模是排序表规模(n n)的函数)的函数第4页/共92页第五页,共92页。
4、第5页/共92页第六页,共92页。9.6 分配(fnpi)排序(基数排序)第6页/共92页第七页,共92页。 1 1 直接插入排序直接插入排序 2 2 折半折半(zhbn)(zhbn)插入排序插入排序 3 3 * *表插入排序表插入排序 3 3 希尔排序希尔排序 插入排序的基本思想是:每次将一个待排序的记录,插入排序的基本思想是:每次将一个待排序的记录,按其关键字大小按其关键字大小(dxio)(dxio)插入到前面已经排好序的子插入到前面已经排好序的子表的适当位置,直到全部记录插入完成,整个表有序为表的适当位置,直到全部记录插入完成,整个表有序为止。止。第7页/共92页第八页,共92页。9.2
5、.1 9.2.1 直接插入排序直接插入排序 直接插入排序是一种简单的插入直接插入排序是一种简单的插入排序方法,基本排序方法,基本(jbn)(jbn)思想为:在思想为:在R1R1至至Ri-1Ri-1长度为长度为i-1i-1的子表已经有序的情况的子表已经有序的情况下,将下,将RiRi插入,得到插入,得到R1R1至至RiRi长度为长度为i i 的子表有序,这样通过的子表有序,这样通过n-1n-1趟(趟(i=2.ni=2.n)之)之后,后,R1R1至至RnRn有序。有序。第8页/共92页第九页,共92页。例如,对于以下序列(为简便起见,每一个记录只例如,对于以下序列(为简便起见,每一个记录只列出其排序
6、码,用排序码代表记录):列出其排序码,用排序码代表记录): 10 18 20 36 60 25 30 18 12 56 10 18 20 36 60 25 30 18 12 56 其中,前其中,前5 5个记录组成的子序列是有序的,这时个记录组成的子序列是有序的,这时要将第要将第6 6个记录插入到前个记录插入到前5 5个记录组成的有序子序列个记录组成的有序子序列中去,得到一个含有中去,得到一个含有6 6个记录的新有序序列。完成这个记录的新有序序列。完成这个插入首先需要个插入首先需要(xyo)(xyo)找到插入位置:找到插入位置:202536202536,因此因此2525应插入到记录应插入到记录2
7、020和记录和记录3636之间,从而得到以之间,从而得到以下新序列:下新序列: 10 18 20 25 36 60 30 18 12 56 10 18 20 25 36 60 30 18 12 56 这就是一趟直接插入排序的过程。这就是一趟直接插入排序的过程。 直接插入排序:仅有一个记录的表总是有序的,因此,对直接插入排序:仅有一个记录的表总是有序的,因此,对n n个记录的表,可从第二个记录的表,可从第二个记录开始直到第个记录开始直到第n n个记录,逐个个记录,逐个(zhg)(zhg)向有序表中进行插入操作,从而得到向有序表中进行插入操作,从而得到n n个记录个记录按关键码有序的表。按关键码有
8、序的表。 第9页/共92页第十页,共92页。第10页/共92页第十一页,共92页。第11页/共92页第十二页,共92页。性能性能(xngnng)(xngnng)分析分析 空间性能空间性能(xngnng)(xngnng):仅用了一个辅助单元:仅用了一个辅助单元R0R0作作为监视哨,空间复杂度为为监视哨,空间复杂度为O(1)O(1)。 时间性能时间性能(xngnng)(xngnng):向有序表中逐个插入记录的:向有序表中逐个插入记录的操作,进行了操作,进行了n n1 1趟,每趟操作分为比较关键码和移动记趟,每趟操作分为比较关键码和移动记录,而比较的次数和移动记录的次数取决于初始序列的排录,而比较的
9、次数和移动记录的次数取决于初始序列的排列情况列情况 。分三种情况讨论:。分三种情况讨论:第12页/共92页第十三页,共92页。)1(2111nnjnjnnnjnj2)1(21)2(11(2) (2) 最坏情况最坏情况(qngkung)(qngkung)下:下: 即第即第j j趟操作,插入记录需要同前面的趟操作,插入记录需要同前面的j j个记录进行个记录进行j j次关次关键码比较,移动记录的次数为键码比较,移动记录的次数为j+2j+2次。次。(1)(1)最好情况下:最好情况下:(2)(2)即待排序列即待排序列(xli)(xli)已按关键码有序,每趟操作只需已按关键码有序,每趟操作只需1 1次比较
10、,次比较,0 0次移动。即:次移动。即:(3)(3) 总比较次数总比较次数= n-1= n-1次次(4)(4) 总移动次数总移动次数= 0= 0次次第13页/共92页第十四页,共92页。(3)(3)平均情况下:平均情况下: 即第即第j j趟操作趟操作(cozu)(cozu),插入记录大约同前面的,插入记录大约同前面的j/2j/2个记录进行个记录进行关键码比较,移动记录的次数为关键码比较,移动记录的次数为j/2+2j/2+2次。次。 21141)1(412nnnjnj211412)1(41)22(nnnnjnj 由此,直接插入排序的时间复杂度为O(n2)。 直接插入排序是一个稳定的排序方法(fn
11、gf)。 直接插入排序也可以在链式结构上实现。 第14页/共92页第十五页,共92页。9.2.2 9.2.2 折半插入排序折半插入排序 直接插入排序的基本操作是向有序表中直接插入排序的基本操作是向有序表中插入一个记录,在直接插入排序中,插入位置插入一个记录,在直接插入排序中,插入位置的确定是通过对有序表中关键码的顺序比较得的确定是通过对有序表中关键码的顺序比较得到的。到的。 既然是在有序表中确定插入位置,因此既然是在有序表中确定插入位置,因此(ync)(ync)在寻找在寻找RiRi的插入位置时,就可以采的插入位置时,就可以采用折半查找的方法,用折半查找方法查找用折半查找的方法,用折半查找方法查
12、找RiRi的插入位置,再将的插入位置,再将RiRi插入进去,使得插入进去,使得RiRi到到RiRi有序,这种方法就是折半插入排序。有序,这种方法就是折半插入排序。第15页/共92页第十六页,共92页。第16页/共92页第十七页,共92页。时间效率时间效率 确定插入位置所进行的折半查找,定位一个关键码确定插入位置所进行的折半查找,定位一个关键码的位置需要比较次数的位置需要比较次数(csh)(csh)至多为至多为 次,次,所以比较次数所以比较次数(csh)(csh)时间复杂度为时间复杂度为O (nlog2n)O (nlog2n)。 相对直接插入排序,折半插入排序只能减少关键字相对直接插入排序,折半
13、插入排序只能减少关键字间的比较次数间的比较次数(csh)(csh),而移动记录的次数,而移动记录的次数(csh)(csh)和直接插入排序相同,故时间复杂度仍为和直接插入排序相同,故时间复杂度仍为O(n2)O(n2)。 折半插入排序是一个稳定的排序方法。折半插入排序是一个稳定的排序方法。 折半插入排序只适合于顺序存储的排序表。折半插入排序只适合于顺序存储的排序表。) 1(log2n第17页/共92页第十八页,共92页。9.2.3 9.2.3 希尔排序希尔排序 又称为又称为“缩小增量排序缩小增量排序”。是。是19591959年年由由D.L.ShellD.L.Shell提出来的提出来的 基本思想:先
14、选取一个小于基本思想:先选取一个小于n n的整数的整数didi(称(称之为步长),然后把排序表中的之为步长),然后把排序表中的n n个记录分为个记录分为didi个组,从第一个记录开始,间隔为个组,从第一个记录开始,间隔为didi的记录为的记录为同一组,各组内进行直接插入排序,一趟之后,同一组,各组内进行直接插入排序,一趟之后,间隔间隔didi的记录有序,随着有序性的改善,减小的记录有序,随着有序性的改善,减小步长步长didi(排序子表变大),重复进行,直到(排序子表变大),重复进行,直到di=1di=1(全部(全部(qunb)(qunb)记录成为一个排序表),记录成为一个排序表),使得间隔为使
15、得间隔为1 1的记录有序,也就使整体达到了有的记录有序,也就使整体达到了有序。序。 步长为步长为1 1时就是前面讲的直接插入排序。时就是前面讲的直接插入排序。 第18页/共92页第十九页,共92页。例:例: 排序列表排序列表(li bio)(li bio)为:为: 39,80,76,41,13,29,50,78,30,11,100,7,41,86 39,80,76,41,13,29,50,78,30,11,100,7,41,86 步长因子分别取步长因子分别取5 5、3 3、1 1,则排序过程如下:,则排序过程如下:3980764113295078301110074186P=5间隔(jin g)
16、为5的子序列分别为:39,29,100,80,50,7,76,78,41,41,30,86,13,11。第19页/共92页第二十页,共92页。第一趟排序结果,使得第一趟排序结果,使得(sh de)(sh de)间隔为间隔为5 5的字表有序:的字表有序: 2974130113950764113100807886P=3子序列分别子序列分别(fnbi)(fnbi)为为:29,30,50,13,78:29,30,50,13,78,7,11,76,100,867,11,76,100,86,41,39,41,8041,39,41,80。第二趟排序结果:。第二趟排序结果: 13739291141307641
17、50868078100P=1此时,序列此时,序列“基本有序基本有序”,对其进行直接插入排序,得到,对其进行直接插入排序,得到(d (d do)do)最终结果:最终结果: 7111329303941415076788086100第20页/共92页第二十一页,共92页。第21页/共92页第二十二页,共92页。时效分析时效分析(fnx)(fnx) 希尔排序时效分析希尔排序时效分析(fnx)(fnx)很难,关键码的比较次很难,关键码的比较次数与记录移动次数依赖于步长因子序列的选取,特定情况数与记录移动次数依赖于步长因子序列的选取,特定情况下可以准确估算出关键码的比较次数和记录的移动次数。下可以准确估算
18、出关键码的比较次数和记录的移动次数。目前还没有人给出选取最好的步长因子序列的方法。目前还没有人给出选取最好的步长因子序列的方法。 步长因子序列可以有各种取法,有取奇数的,也有取步长因子序列可以有各种取法,有取奇数的,也有取质数的,但需要注意:步长因子中除质数的,但需要注意:步长因子中除1 1外没有公因子,且最外没有公因子,且最后一个步长因子必须为后一个步长因子必须为1 1。 希尔排序方法是一个不稳定的排序方法。希尔排序方法是一个不稳定的排序方法。第22页/共92页第二十三页,共92页。9.6 分配(fnpi)排序(基数排序)第23页/共92页第二十四页,共92页。 交换排序的基本思想是:通过排
19、序表中两个记录关键码的交换排序的基本思想是:通过排序表中两个记录关键码的比较比较(bjio),若与排序要求相逆,则将二者进行交换,直至没,若与排序要求相逆,则将二者进行交换,直至没有反序的记录为止。有反序的记录为止。 交换排序的特点是:排序码值较小记录的向序列的一端移动,交换排序的特点是:排序码值较小记录的向序列的一端移动,排序码值较大记录的向序列的另一端移动。排序码值较大记录的向序列的另一端移动。9.3.1 9.3.1 冒泡排序冒泡排序9.3.2 9.3.2 快速快速(kui s)(kui s)排序排序第24页/共92页第二十五页,共92页。9.3.1 9.3.1 冒泡排序冒泡排序 设排序表
20、为设排序表为R1.Rn,对,对n个记录的排序表进行冒泡排序个记录的排序表进行冒泡排序(Bubble Sort)的过程是:的过程是: 第第1趟,从第趟,从第1个记录开始到第个记录开始到第n个记录,对个记录,对n1对相邻的两个记录关对相邻的两个记录关键字进行比较,若与排序要求相逆,则将二者交换。键字进行比较,若与排序要求相逆,则将二者交换。 一趟之后,具有最大关键字的记录交换到了一趟之后,具有最大关键字的记录交换到了Rn, 第第2趟,从第趟,从第1个记录开始到第个记录开始到第n1个记录继续进行第二趟冒泡。个记录继续进行第二趟冒泡。 两趟之后,具有次最大关键字的记录交换到了两趟之后,具有次最大关键字
21、的记录交换到了Rn1, 如此重复,如此重复,n1趟后,在趟后,在R1.Rn中,中,n个记录按关键码有序。个记录按关键码有序。 冒泡排序最多进行冒泡排序最多进行 n1趟,在某趟的两两比较过程中,如果一次交趟,在某趟的两两比较过程中,如果一次交换都未发生,表明换都未发生,表明(biomng)已经有序,则排序提前结束。已经有序,则排序提前结束。第25页/共92页第二十六页,共92页。第26页/共92页第二十七页,共92页。效率效率(xio l)(xio l)分析分析空间效率空间效率(xio l)(xio l):仅用了一个辅助单元。:仅用了一个辅助单元。时间效率时间效率(xio l)(xio l):总
22、共要进行:总共要进行n-1n-1趟冒泡,对趟冒泡,对j j个记录的表进行一趟冒泡需要个记录的表进行一趟冒泡需要j-1j-1次关键码比较。次关键码比较。 )1(21)1(2nnjnj移动次数(csh):最好情况下:待排序列已有序,不需移动。最坏情况下:每次比较后均要进行三次移动。)1(23)1(32nnjnj第27页/共92页第二十八页,共92页。9.3.2 9.3.2 快速排序快速排序1 1、快速排序的思想、快速排序的思想 快速排序是通过比较关键码、交换记录,快速排序是通过比较关键码、交换记录,以某个记录为界以某个记录为界( (该记录称为支点,通常取第一该记录称为支点,通常取第一个元素个元素)
23、 ),将待排序列分成两部分。其中,一部,将待排序列分成两部分。其中,一部分所有记录的关键码大于等于支点记录的关键码,分所有记录的关键码大于等于支点记录的关键码,另一部分所有记录的关键码小于支点记录的关键另一部分所有记录的关键码小于支点记录的关键码。码。 我们将待排序列按关键码以支点记录分成两我们将待排序列按关键码以支点记录分成两部分的过程,称为一次(趟)划分部分的过程,称为一次(趟)划分(hu fn)(hu fn)。 对各部分不断划分对各部分不断划分(hu fn)(hu fn),直到每一,直到每一步分只剩一个元素,整个序列则按关键码有序。步分只剩一个元素,整个序列则按关键码有序。第28页/共9
24、2页第二十九页,共92页。 low low highhigh从从lowlow向后搜索大于向后搜索大于4949的记录,找到后将其调整到的记录,找到后将其调整到highhigh位位置,得到结果:置,得到结果: 27 14 38 27 14 38 96 65 8 96 65 8 49 55 74 49 55 74 low low highhigh第29页/共92页第三十页,共92页。第30页/共92页第三十一页,共92页。第31页/共92页第三十二页,共92页。4 4、快速排序、快速排序 经过划分之后,支点则到了最终排好序的位经过划分之后,支点则到了最终排好序的位置上,再分别置上,再分别(fnbi)
25、(fnbi)对支点前后的两组继续划分对支点前后的两组继续划分下去,直到每一组只有一个记录为止,则是最后的有下去,直到每一组只有一个记录为止,则是最后的有序序列,这就是快速排序。序序列,这就是快速排序。 快速排序(pi x)过程就是反复划分的过程,算法如下:【算法9-7】快速排序(pi x)算法void Quick_Sort(datatype R , int s, int t) /*对Rs.Rt进行快速排序(pi x)*/ if( st ) i = Partition(R, s, t) /*将表一分为二*/ Quick_Sort(R, s, i1); /*对支点前端子表递归排序(pi x)*/
26、Quick_Sort(R, i+1, t); /*对支点后端子表递归排序(pi x)*/ 第32页/共92页第三十三页,共92页。38749684927554965145 5、效率、效率(xio l)(xio l)分分析析第33页/共92页第三十四页,共92页。第34页/共92页第三十五页,共92页。 最坏情况下:即每次划分,只得到一个子序列(xli),时效为O(n2)。 快速排序是通常被认为在同数量级(O(nlog2n))的排序方法中平均性能最好的。 但若初始序列(xli)按关键码有序或基本有序时,快排序反而蜕化为冒泡排序。为改进之,通常以“三者取中法”来选取支点记录,即将排序区间的两个端点
27、与中点三个记录关键码居中的作为支点记录。 快速排序是一个不稳定的排序方法(如:2,2,1) 。第35页/共92页第三十六页,共92页。9.6 分配(fnpi)排序(基数排序)第36页/共92页第三十七页,共92页。第37页/共92页第三十八页,共92页。 根据根据(gnj)(gnj)选择最小关键码记录的方式不同,选择选择最小关键码记录的方式不同,选择排序又有多种方法,在本节中我们重点讲两种选择排序:排序又有多种方法,在本节中我们重点讲两种选择排序:9.4.1 9.4.1 简单选择排序简单选择排序9.4.3 9.4.3 堆排序堆排序第38页/共92页第三十九页,共92页。第第i i趟,趟, 从第
28、从第i i个到第个到第n n个记录个记录中选择关键码最小的记录与第中选择关键码最小的记录与第i i个记录交换个记录交换; ;直到直到(zhdo)(zhdo)第第n-1n-1趟,从最后趟,从最后两个记录中选择较小的记录放两个记录中选择较小的记录放置在第置在第n-1 n-1 位置。排序结束。位置。排序结束。第39页/共92页第四十页,共92页。第40页/共92页第四十一页,共92页。3 3、算法实现、算法实现【算法【算法9-89-8】简单选择排序】简单选择排序void Select_Sort(datatype R ,int n)void Select_Sort(datatype R ,int n)
29、 / /* *对排序表对排序表R1.RnR1.Rn进行冒泡排序,进行冒泡排序,n n是记是记录个数录个数* */ / for(i=1;in;i+) for(i=1;in;i+) / /* * 作作n-1n-1趟选取趟选取 * */ / k=i; k=i; / /* * 在在i i开始的开始的n-i+1n-i+1个记个记录中选关键码最小的记录录中选关键码最小的记录 * */ /for(j=i+1; j=n; j+) for(j=i+1; j=n; j+) if(Rj.keyRk.key) if(Rj.keyRk.key) k=j; k=j;/ /* * k k中存放关键码最小中存放关键码最小记录
30、的下标记录的下标(xi bio) (xi bio) * */ / if (i!=k) / if (i!=k) /* * 关键码最小的记录与关键码最小的记录与第第i i个记录交换个记录交换 * */ / R0=Rk; Rk=Ri; R0=Rk; Rk=Ri; Ri=R0 ; Ri=R0 ; 注意注意i,j,ki,j,k的意义:的意义: i i:控制趟循环;:控制趟循环; j: j: 控制每趟中从第控制每趟中从第i i个元素到第个元素到第n n个元素选择最小值的循环;个元素选择最小值的循环; k: k: 用来指向本趟中到当前为止找用来指向本趟中到当前为止找到的最小元素。到的最小元素。第41页/共9
31、2页第四十二页,共92页。第42页/共92页第四十三页,共92页。9.4.3 9.4.3 堆排序堆排序 继承了前面继承了前面(qin mian)(qin mian)的工作的工作 简单选择排序(pi x)的思想简单,易于实现,但其时间性能没有优势,这是因为在每趟的选择中,没有把前面选择过程中的一些有用信息继承下来,因此每趟选择都是顺序的一一进行,如果某一趟的选择能够把前面有用的一些信息继承下来,则定会减少本趟的比较次数,提高排序(pi x)效率,堆排序(pi x)就做到了这一点。第43页/共92页第四十四页,共92页。1.1.堆的定义堆的定义 设有设有n n个元素的序列个元素的序列(xli) R
32、1(xli) R1,R2R2,RnRn,当且仅当满足下述关系之一时,称之为堆。当且仅当满足下述关系之一时,称之为堆。前者称为小顶堆,后者称为大顶堆。前者称为小顶堆,后者称为大顶堆。kik2ik2i+1kik2ik2i+1或其中i=1,2,n/2 第44页/共92页第四十五页,共92页。 如果该序列是一个堆,则对应的这棵完全二叉树的特点是:所有分支结点的值均不小于 (或不大于)其子女的值,即每棵子树根(sh n)结点的值是最大(或最小)的。堆特点:堆顶元素是整个序列中最大(或最小)的元素。8516364730532491小顶堆 :16,36,24,85,47,30,53,914791243653
33、308516大顶堆:91,47,85,24,36,53,30,16第45页/共92页第四十六页,共92页。2 2堆排序堆排序 堆特点:堆顶元素是整个序列堆特点:堆顶元素是整个序列(xli)(xli)中最大中最大( (或最小或最小) )的元素。的元素。 若将排序表按关键码建成堆,堆顶元素就是选择出若将排序表按关键码建成堆,堆顶元素就是选择出的最大元素(或最小),这样就得到的最大元素(或最小),这样就得到n n个元素中的第一个个元素中的第一个的元素。的元素。 然后,再对剩下的然后,再对剩下的n-1n-1个元素建成堆,得到个元素建成堆,得到n n个元素个元素中关键码次大中关键码次大 ( (或次小或次
34、小) )的元素。以此类推,如此反复,的元素。以此类推,如此反复,直到进行直到进行n-1n-1次后,排序结束,便得到一个按关键码有序次后,排序结束,便得到一个按关键码有序的序列的序列(xli)(xli)。称这个过程为堆排序。称这个过程为堆排序。 因此,实现堆排序需解决两个问题:因此,实现堆排序需解决两个问题: 1. 1. 如何如何(rh)(rh)将将n n个元素的排序序列按关键码建成堆个元素的排序序列按关键码建成堆(初始堆);(初始堆); 2. 2. 怎样将剩余的怎样将剩余的n-1n-1个元素按其关键码调整为一个新堆。个元素按其关键码调整为一个新堆。第46页/共92页第四十七页,共92页。914
35、7243653308516a.初始堆输出堆顶元素,再将最后一个元素放入堆顶(为了操作简便,将堆顶元素R1与Rn交换)。b.堆被破坏调 整 : 根 结点 ( j i din)与左右 子 女 较 大者 比 较 , 若比 根 小 , 交换。c.右子树不满足 堆 , 继 续( j x ) 调整 。d.到了叶子(y zi)结点 , 调 整 结束,堆建成。858547471630539116472436533085918547243653301691第47页/共92页第四十八页,共92页。R1与Rn-1交换(jiohun),堆被破坏。对R1与Rn-2调整。仅需调整(tiozhng)一次,堆建成 。堆调整(
36、tiozhng)结束。858547471630539185304747168553918553474716853091第48页/共92页第四十九页,共92页。第二个问题的背景:第二个问题的背景: 输出堆顶元素后,将堆底元素送入堆顶(或将堆顶元素与堆底输出堆顶元素后,将堆底元素送入堆顶(或将堆顶元素与堆底元素交换),堆可能被破坏。元素交换),堆可能被破坏。 破坏的情况仅是根结点和其左右孩子之间可能不满足堆的特性,破坏的情况仅是根结点和其左右孩子之间可能不满足堆的特性,而其左右子树仍然是局部的堆。而其左右子树仍然是局部的堆。 在这种情况下,将其在这种情况下,将其R1 Ri整理整理(zhngl)成堆
37、。成堆。 (i=n-1.1)调整方法:调整方法: 将根结点与左、右孩子中较小将根结点与左、右孩子中较小( (大顶堆为较大大顶堆为较大) )的进行交的进行交换。若与左孩子交换,则左子树堆可能被破坏换。若与左孩子交换,则左子树堆可能被破坏(phui)(phui),且仅左子树的根结点处不满足堆的性质;若与右孩子交换,且仅左子树的根结点处不满足堆的性质;若与右孩子交换,则右子树堆可能被破坏则右子树堆可能被破坏(phui)(phui),且仅右子树的根结点处,且仅右子树的根结点处不满足堆的性质。继续对不满足堆性质的子树进行上述操作,不满足堆的性质。继续对不满足堆性质的子树进行上述操作,直到满足了堆性质或者
38、到叶子结点,堆被建成。直到满足了堆性质或者到叶子结点,堆被建成。 称这个自根结点到叶子结点的调整过程为筛选。称这个自根结点到叶子结点的调整过程为筛选。第49页/共92页第五十页,共92页。9147243653308516a.初始堆。输出(shch)堆顶元素,再将最后一个元素放入堆顶(为了操作简便,将堆顶元素R1与Rn交换)。b.堆被破坏调整:根结点与左右(zuyu)子女较大者比较,若比根大,交换c.右子树不满足(mnz)堆,继续调整 d.到了叶子结点,调整结束,堆建成。164724365330859124854736533016912485473616305312第50页/共92页第五十一页,
39、共92页。3. 3. 【算法【算法9-99-9】筛选算法】筛选算法void HeapAdjust(datetype R , int s, int t)void HeapAdjust(datetype R , int s, int t) / /* *以以RsRs为根的子树只有为根的子树只有RsRs与其左右孩子之间与其左右孩子之间可能不满足堆特性可能不满足堆特性* * / /* *进行调整使以进行调整使以RsRs为根的子树成为为根的子树成为(chngwi)(chngwi)大顶堆大顶堆* */ /datetype rc; /datetype rc; /* *缓冲变量缓冲变量* */ /rc=Rsrc
40、=Rs;i=s;i=s; for(j=2 for(j=2* *i; j=t; j=2i; j=t; j=2* *j) /j) /* *沿关键码较大的孩沿关键码较大的孩子结点向下筛选子结点向下筛选* */ / if(jt & Rj.keyRj+1.key) if(jt & Rj.key Rj.key) break; / if(rc.key Rj.key) break; /* *不用不用调到叶子就到位了调到叶子就到位了* */ / Ri=Rj; i=j; Ri=Rj; i=j; / /* *准备继准备继续向下调整续向下调整 * */ / Ri=rc Ri=rc; / /* *插入插
41、入* */ / 第51页/共92页第五十二页,共92页。第52页/共92页第五十三页,共92页。再讨论第一个问题(wnt):对原始排序表建初始堆的过程。 对原始序列建堆过程,就是一个反复进行筛选的过程。 仍然通过对应的完全二叉树分析:对n个结点的完全二叉树,可以认为:以叶子为根的子树(只有它自己)已满足堆特性,因此从最后一个分支结点开始,把每棵子树调整为堆,直到根结点为止,整棵树成为堆。 最后一个分支结点是第 个结点。2n第53页/共92页第五十四页,共92页。例:建堆的过程:例:建堆的过程:设初始排序设初始排序(pi x)(pi x)序列:序列:30 24 85 16 36 53 91 47
42、 30 24 85 16 36 53 91 47 ,建成大顶堆。,建成大顶堆。3024163653918547a.8个结点(ji din)的初始状态。 从R4结点(ji din)开始调整; b.调整结束后,以R4为根的子树满足(mnz)堆特性。再将以R3结点为根的子树调整为堆;3024473653918516c. 以 R3为根的子树满足堆特性。再将以R2结点为根的子树调整为堆;30244736 53859116第54页/共92页第五十五页,共92页。91472436538530169147243653308516以R2为根的子树满足(mnz)堆特性。 再将以R1结点为根的子树调整为堆d. 调整
43、(tiozhng)结束后,整棵树为堆。3047243653859116可见,初始建堆的过程也是反复筛选的过程.借助于筛选算法(sun f),排序表建立初始堆的过程为: for (i=n/2;i0;i-) HeapAdjust(R,i,n);第55页/共92页第五十六页,共92页。堆排序:堆排序: 对对n n个元素的序列进行堆排序,先将其建成堆,以根结点与第个元素的序列进行堆排序,先将其建成堆,以根结点与第n n个结个结点交换;调整前点交换;调整前n-1n-1个结点成为堆,再以根结点与第个结点成为堆,再以根结点与第n-1n-1个结点交换;个结点交换;重复上述操作,直到整个序列有序。重复上述操作,
44、直到整个序列有序。【算法【算法(sun f)9-10(sun f)9-10】堆排序算法】堆排序算法(sun f)(sun f)void HeapSort(datetype R , int n)void HeapSort(datetype R , int n) / /* *将序列将序列R1.RnR1.Rn按堆排序方法进行排序按堆排序方法进行排序* *for(i=n/2; i0; i- ) for(i=n/2; i0; i- ) HeapAdjust(R, i, n); /HeapAdjust(R, i, n); /* *将序列将序列R1.RnR1.Rn建成初始堆建成初始堆 * */ /for(i
45、=n; i1; i-)for(i=n; i1; i-) R0=R1; / R0=R1; /* * 堆顶堆顶R1R1与堆底元素与堆底元素RiRi交换交换 * */ / R1=Ri; R1=Ri; Ri=R0; Ri=R0; HeapAdjust(R,1, i-1); / HeapAdjust(R,1, i-1); /* *将将R1.Ri-1R1.Ri-1重新调整为堆重新调整为堆* */ / 第56页/共92页第五十七页,共92页。第57页/共92页第五十八页,共92页。9.6 分配(fnpi)排序(基数排序)第58页/共92页第五十九页,共92页。9.5 9.5 归并排序归并排序 归并排序的思想
46、是将几个归并排序的思想是将几个(j (j )相邻相邻的有序表合并成一个总的有序表,本节主要介绍的有序表合并成一个总的有序表,本节主要介绍2-2-路归并排序。路归并排序。1 1两个有序表的合并两个有序表的合并 二路归并排序的基本操作是将两个有序表二路归并排序的基本操作是将两个有序表合并为一个有序表。合并为一个有序表。 R: 25 38 46 75 18 37 R: 25 38 46 75 18 37 40 46 78 80 40 46 78 80 s m m+1 s m m+1 t t R1: 18 25 37 38 46 46 75 R1: 18 25 37 38 46 46 75 78 80
47、 78 80 s s t t第59页/共92页第六十页,共92页。第60页/共92页第六十一页,共92页。2. 2-2. 2-路归并路归并(gubng)(gubng)算法算法 2-路归并的基本思想是:只有1个元素的表总是有序的,所以将排序表R1.n,看作(kn zu)是n个长度为len=1的有序子表,对相邻的两个有序子表两两合并到R11.n,使之生成表长len=2的有序表;再进行两两合并到R1.n中,直到最后生成表长len=n的有序表。这个过程需要log2n趟。第61页/共92页第六十二页,共92页。第62页/共92页第六十三页,共92页。第63页/共92页第六十四页,共92页。void Me
48、rgeSort(datatype R , datatype R1 , void MergeSort(datatype R , datatype R1 , int n) int n) / /* *对排序表对排序表R1.RnR1.Rn作归并排序作归并排序* */ / MSort(R, R1,1, n); MSort(R, R1,1, n); 第64页/共92页第六十五页,共92页。4.4.效率分析效率分析 需要一个与表等长的辅助元素数组空间,所以空需要一个与表等长的辅助元素数组空间,所以空间复杂度为间复杂度为O(n)O(n)。 对对n n个元素的表,将这个元素的表,将这n n个元素看作叶结点,若将
49、两个元素看作叶结点,若将两两归并生成的子表看作它们的父结点,则归并过程两归并生成的子表看作它们的父结点,则归并过程(guchng)(guchng)对应由叶向根生成一棵二叉树的过程对应由叶向根生成一棵二叉树的过程(guchng)(guchng)。所以归并趟数约等于二叉树的高度。所以归并趟数约等于二叉树的高度-1-1,即即log2nlog2n,每趟归并需移动记录,每趟归并需移动记录n n次,故时间复杂度为次,故时间复杂度为O(nlog2n)O(nlog2n)。第65页/共92页第六十六页,共92页。9.6 分配(fnpi)排序(基数排序)第66页/共92页第六十七页,共92页。9.6基数排序 基数
50、排序是一种借助于多关键码排序的思想,是将单关键码按基数分成“多关键码”进行排序的方法(fngf)。 9.6.1 多关键码排序 扑克牌中52张牌,可按花色和面值分成两个字段,其大小关系为:花色:梅花 方块 红心 黑心面值:2 3 4 5 6 7 8 9 10 J Q K A若对扑克牌按花色、面值进行升序排序,得到如下序列:梅花2,3,.,A,方块2,3,.,A,红心2,3,.,A,黑心2,3,.,A 这就是多关键码排序。第67页/共92页第六十八页,共92页。 第68页/共92页第六十九页,共92页。第69页/共92页第七十页,共92页。9.6.2链式基数排序 将关键码拆分为若干项,每项作为一个
51、“关键码”,则对单关键码的排序可按多关键码排序方法进行(jnxng)。比如,关键码为4位的整数,可以每位对应一项,拆分成4项;又如,关键码由5个字符组成的字符串,可以每个字符作为一个关键码。由于这样拆分后,每个关键码都在相同的范围内(对数字是09,字符是az),称这样的关键码可能出现的符号个数为“基”,记作RADIX。上述取数字为关键码的“基”为10;取字符为关键码的“基”为26。基于这一特性,用LSD法排序较为方便。 1、基数排序基本思想: 从最低位关键码起,按关键码的不同值将序列中的记录“分配”到RADIX个队列中,然后再“收集”之。如此重复d次即可。链式基数排序是用RADIX个链队列作为
52、分配队列,关键码相同的记录存入同一个链队列中,收集则是将各链队列按关键码大小顺序链接起来。第70页/共92页第七十一页,共92页。2、示例9-9:以静态链表存储(cn ch)待排记录,头结点指向第一个记录。链式基数排序过程如下图。278109063930589184505269008083e0e1e2e3e4e5e6e7e8e9269589109008278505184083063930f0f1f2f3f4f5f6f7f8f9(a)初始记录初始记录(jl)的静态链表的静态链表(b)第一趟按个位数分配,修改结点指针第一趟按个位数分配,修改结点指针(zhzhn)域,域, 将链表中的记录分配到相应链
53、队列中将链表中的记录分配到相应链队列中第71页/共92页第七十二页,共92页。930063083184505278008109589269e0e1e2e3e4e5e6e7e8e9589184083930f0f1f2f3f4f5f6f7f8f9(c)第一趟收集:将各队列链接起来第一趟收集:将各队列链接起来(q li),形成单链表,形成单链表(d)第一趟按十位数分配,修改结点第一趟按十位数分配,修改结点(ji din)指针域,指针域, 将链表中的记录分配到相应链队列中将链表中的记录分配到相应链队列中109008505269063278505008109930063269278083184589(e
54、)第二趟收集第二趟收集(shuj):将各队列链接起来,形成单链表:将各队列链接起来,形成单链表第72页/共92页第七十三页,共92页。e0e1e2e3e4e5e6e7e8e9f0f1f2f3f4f5f6f7f8f9(f)第一趟按百位数分配,修改第一趟按百位数分配,修改(xigi)结点指针域,结点指针域, 将链表中的记录分配到相应链队列中将链表中的记录分配到相应链队列中083063008589505930008063083109184269278505589930(g)第三趟收集:将各队列链接起来,形成第三趟收集:将各队列链接起来,形成(xngchng)单链表。单链表。 此时,序列已有序。此时,
55、序列已有序。184109278269第73页/共92页第七十四页,共92页。头尾指针*SNodeType RMAXNUM /*静态链表的存储区,R0作为头结点*Q_Node qRADIX ; /* RADIX个队列的头尾指针向量*/第74页/共92页第七十五页,共92页。 p=Rp.next; 第75页/共92页第七十六页,共92页。第76页/共92页第七十七页,共92页。第77页/共92页第七十八页,共92页。5、效率分析 时间效率:设待排序列为n个记录,d个关键码,关键码的取值范围为radix,则进行链式基数排序的时间复杂度为O(d(n+radix),其中,一趟分配时间复杂度为O(n),一
56、趟收集时间复杂度为O(radix),共进行d趟分配和收集。 空间效率:需要2*radix个指向队列(duli)的辅助空间,以及用于静态链表的n个指针。第78页/共92页第七十九页,共92页。9.7 外排序 9.7.1 外部排序的方法 外部排序基本上由两个相互独立的阶段组成。 首先,按可用内存大小,将外存上含n个记录的文件分成若干长度为k的子文件或段(segment),依次读入内存并利用(lyng)有效的内部排序方法对它们进行排序,并将排序后得到的有序子文件重新写入外存。通常称这些有序子文件为归并段或顺串;然后,对这些归并段进行逐趟归并,使归并段(有序子文件)逐渐由小到大,直至得到整个有序文件为
57、止。 显然,第一阶段的工作已经讨论过。以下主要讨论第二阶段即归并的过程。先从一个例子来看外排序中的归并是如何进行的?第79页/共92页第八十页,共92页。R1R2R3R4R5R6R7R8R9R10R1R2R3R4R5R1R2R5R1R5有序文件有序文件 假设有一个含假设有一个含 10000 10000 个记录的文件,首先通过个记录的文件,首先通过1010次内部排序次内部排序得到得到1010个初始归并个初始归并(gubng)(gubng)段段 R1 R1R10 R10 ,其中每一段都含,其中每一段都含10001000个记录。然后对它们作如下图所示的两两归并个记录。然后对它们作如下图所示的两两归并
58、(gubng)(gubng),直至得到一个有序文件为止。直至得到一个有序文件为止。第80页/共92页第八十一页,共92页。从上面的图中可见,由10个初始归并段到一个有序文件(wnjin),共进行了四趟归并,每一趟从m个归并段得到 个归并段。2/m 将两个有序段归并成一个有序段的过程,若在内存中进行,则很简单,前面讨论的2-路归并排序中的Merge函数便可实现此归并。但是,在外部排序中实现两两归并时,不仅要调用Merge函数,而且要进行外存的读/写,这是由于我们不可能将两个有序段及归并结果同时放在内存中的缘故。对外存上信息的读/写是以“物理块”为单位。假设在上例中每个物理块可以容纳(rngn)200个记录,则每一趟归并需进行50次“读”和50次“写”,四趟归并加上内部排序时所需进行的读/写,使得在外排序中总共需进行500次的读/写。这种方法称为(chn wi)2-路平衡归并。第81页/共92页第八十二页,共92页。一般情况下,外部排序所需总时间= 内部排序(产生初始归并段)所需时间 m*t
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 城市地下管廊安全防范管理手册
- 制造业数智化车间建设设计
- 旅游基础设施建设项目绩效评价报告
- 养老服务中心规划设计方案
- AI在文献检索与论文写作中的应用培训
- 石油化工企业硫磺回收装置岗位巡检制度
- 大跨度钢梁工厂预制与运输专项施工方案
- 生活垃圾分类处置管理规范
- 磷矿采矿项目商业计划书
- 初中生科学测试题与详细答案
- 2026年教师师德师风知识专项测试卷及答案
- 省级生态农场建设方案
- 《区块链金融》教学大纲
- 2026年机动车排放检验机构弄虚作假检查与判定试题
- 中医医院内部管理制度
- 公共安全监控系统集成规范(标准版)
- XX公司2026年度安全生产应急演练计划
- 投资占股合同范本
- 《社区居家适老化环境设计》健康养老专业全套教学课件
- 配液系统技术交流
- 循证医学考试试题及答案
评论
0/150
提交评论