数据结构PPT(第10章排序)_第1页
数据结构PPT(第10章排序)_第2页
数据结构PPT(第10章排序)_第3页
数据结构PPT(第10章排序)_第4页
数据结构PPT(第10章排序)_第5页
已阅读5页,还剩43页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、安安徽徽理理工工大大学学第第10章章 内部排序内部排序v 理解和熟悉各种内部排序的基本思想和过程;理解和熟悉各种内部排序的基本思想和过程;v 掌握内部排序算法的时间复杂度的分析方法和结论;掌握内部排序算法的时间复杂度的分析方法和结论;v 要求能根据各种内部排序方法的优缺点及不同场合选择要求能根据各种内部排序方法的优缺点及不同场合选择合适的排序方法。合适的排序方法。学习要点学习要点安安徽徽理理工工大大学学10.1 概概 述述排序:排序:设含有设含有n个记录的文件个记录的文件R1,R2,.,Rn,其相应的关键字为,其相应的关键字为 K1,K2,.,Kn ,将记录按关键字值非递减(或非递增)顺,将记

2、录按关键字值非递减(或非递增)顺序排列的过程,称为排序。序排列的过程,称为排序。 对所有的对所有的Ki=Kj (ij),若排序前),若排序前Ri领先于领先于Rj,排序后,排序后Ri仍仍领先于领先于Rj,则称该排序方法是,则称该排序方法是稳定的稳定的,反之称为,反之称为不稳定的不稳定的。内部排序:内部排序:待排序文件的全部记录存放在内存进行的排序,称待排序文件的全部记录存放在内存进行的排序,称为内部排序。为内部排序。外部排序:外部排序:排序过程中需要进行内外存数据交换的排序,称为排序过程中需要进行内外存数据交换的排序,称为外部排序。外部排序。安安徽徽理理工工大大学学10.1 概概 述述在排序过程

3、中,通常进行两种基本操作:在排序过程中,通常进行两种基本操作:(1)比较两个关键字大小;)比较两个关键字大小;(2)将记录从一个位置移到另一个位置。)将记录从一个位置移到另一个位置。约定:约定:v 待排序的一组记录存放在地址连续的一组存储单元中,它类待排序的一组记录存放在地址连续的一组存储单元中,它类似于线性表的顺序存储结构。似于线性表的顺序存储结构。v 待排的记录的数据类型定义如下:待排的记录的数据类型定义如下:typedef struct int key; InfoType otherinfo; RedType;typedef struct RedType rMAXSIZE + 1 ; i

4、nt length; SqList;安安徽徽理理工工大大学学10.2 插入排序插入排序10.2.1 直接插入排序直接插入排序基本思想:将一个记录插入到已排好序的有序表中,得到一个新基本思想:将一个记录插入到已排好序的有序表中,得到一个新的、记录数增的、记录数增1的有序表。的有序表。例如:已知待排序的一组记录为例如:已知待排序的一组记录为49、38、65、97、40、13、27。假设在排序过程中,前假设在排序过程中,前4个记录已按关键字递增的次序重新排列,个记录已按关键字递增的次序重新排列,构成一个含构成一个含4个记录的有序序列个记录的有序序列38,49,65,97 ,现要将关键,现要将关键字为

5、字为40的记录插入该序列中,则按从后向前的顺序对该序列进行的记录插入该序列中,则按从后向前的顺序对该序列进行查找,由于查找,由于38 40 49,则,则76应插入到应插入到65和和97之间,从而得到之间,从而得到新的有序序列新的有序序列 38,40,49,65,97 ,称该过程为,称该过程为一趟直接插一趟直接插入排序入排序。安安徽徽理理工工大大学学q 直接插入排序方法直接插入排序方法方法:方法:将序列中的第一个记录看成是一个有序的子序列,从第将序列中的第一个记录看成是一个有序的子序列,从第二个记录起逐个进行插入,直至整个序列变成按关键字非递减二个记录起逐个进行插入,直至整个序列变成按关键字非递

6、减有序序列为止。有序序列为止。Status InsertSort ( SqList &L ) for( i=2; i=L.length; +i ) if( LT( L.ri.key, L.ri-1.key ) ) L.r0 = L.ri; /复制为哨兵复制为哨兵 L.ri = L.ri-1; for( j=i-2; LT( L.r0.key, L.rj.key ); -j ) L.rj+1 = L.rj; /记录后移记录后移 L.rj+1 = L.r0; /插入到正确位置插入到正确位置 /InsertSort安安徽徽理理工工大大学学L.r0 初始关键字初始关键字: (49) 38 65

7、 97 76 13 27 49*i=2: (38)()(38 49) 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 48 49 49* 65 76 97)q 直接插入排序示例直接插入排序示例安安徽徽理理工工大

8、大学学 对于排序的效率分析,主要从对于排序的效率分析,主要从比较次数比较次数和和移动次数移动次数两两方面着手。方面着手。 直接插入排序的效率与待排文件的关键字排列有关,直接插入排序的效率与待排文件的关键字排列有关,最好情况为最好情况为O(n),最坏情况为,最坏情况为O(n2)。 直接插入排序的平均时间复杂度为直接插入排序的平均时间复杂度为O(n2)。 直接插入排序是稳定的。直接插入排序是稳定的。q 直接插入排序效率分析直接插入排序效率分析安安徽徽理理工工大大学学基本思想基本思想 :设在顺序表中有一:设在顺序表中有一 个对象序列个对象序列 V0, V1, , Vn-1。其中。其中, V0, V1

9、, , Vi-1 是已经排好序的对象是已经排好序的对象。在插入。在插入Vi 时时, 利用折半搜索法寻找利用折半搜索法寻找Vi 的插入位置。的插入位置。10.2.2 折半插入排序折半插入排序安安徽徽理理工工大大学学void BInsertSort(SqList &L) for (i=2;i=L.length;+i) L.r0=L.ri; low = 1; high=i-1; while (low =high+1;-j) L.rj+1=L.rj; L.rhigh+1=L.r0; 和直接插入排序相和直接插入排序相比,折半插入排序仅比,折半插入排序仅减少了比较次数,而减少了比较次数,而记录的移

10、动次不变。记录的移动次不变。其时间复杂度仍为其时间复杂度仍为O(n2)。q 折半插入排序算法折半插入排序算法安安徽徽理理工工大大学学 基本思想:希尔排序先将整个待排元素序列分割成若干个子序基本思想:希尔排序先将整个待排元素序列分割成若干个子序列(列(由相隔某个由相隔某个“增量增量”的元素组成的的元素组成的)分别进行直接插入排)分别进行直接插入排序,待整个序列中的元素基本有序时,再对全体元素进行一次序,待整个序列中的元素基本有序时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下直接插入排序。因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排

11、序在时间效率(接近最好情况),效率是很高的,因此希尔排序在时间效率上比前一种方法有较大提高。上比前一种方法有较大提高。 1. 若待排序文件若待排序文件基本有序基本有序,即文件中具有特性:,即文件中具有特性: ri.keyMaxrj (其中(其中1ji)的记录数较少,)的记录数较少, 则文件中则文件中大多数记录都不需要进行插入。大多数记录都不需要进行插入。 2. 基本有序时,直接插入排序效率可以提高,接近于基本有序时,直接插入排序效率可以提高,接近于O(n) 。10.2.3 希尔排序希尔排序安安徽徽理理工工大大学学例如,例如,n=8,数组,数组R的八个元素分别为:的八个元素分别为:17,3,30

12、,25,14,17*,20,9。下面给出希尔排序算法的执行过程。下面给出希尔排序算法的执行过程。初始状态:初始状态:d=4 17 3 30 25 14 17* 20 9第一趟结果:第一趟结果:d=2 14 3 20 9 17 17* 30 25第二趟结果:第二趟结果:d=1 14 3 17 9 20 17* 30 35第三趟结果:第三趟结果: 3 9 14 17 17* 20 30 35q 希尔排序示例希尔排序示例安安徽徽理理工工大大学学void ShellInsert(SqList &L, int dk) for (i=dk+1;i0 & LT(L.r0.key,L.rj.k

13、ey); j-=dk) L.rj+gap=L.rj;L.rj+gap=L.r0; void ShellSort(SqList &L, int dlta ,int t) for (int k=0;kt;+k) ShellInsert(L,dltak); q 希尔排序算法希尔排序算法安安徽徽理理工工大大学学v 对希尔排序的分析提出了许多困难的数学问题,特别是如何对希尔排序的分析提出了许多困难的数学问题,特别是如何选择增量序列才能产生最好的排序效果,至今没有得到解决。选择增量序列才能产生最好的排序效果,至今没有得到解决。 为什么希尔排序的时间性能优于直接插入排序呢?当文件为什么希尔排序的时间

14、性能优于直接插入排序呢?当文件初基本有序时直接插入排序所需的比较和移动次数均较少。另初基本有序时直接插入排序所需的比较和移动次数均较少。另一面,当一面,当n值较小时,值较小时,n和和n2的差别也较小,即直接插入排序的的差别也较小,即直接插入排序的最好时间复杂度最好时间复杂度O(n)和最坏时间复杂度和最坏时间复杂度O(n2)差别不大。在希尔差别不大。在希尔排序时增量较大,分组较多,每组的记录数目少,故各组内直排序时增量较大,分组较多,每组的记录数目少,故各组内直接插入较快,后来增量接插入较快,后来增量di逐渐缩小,分组数逐渐减少,而各组逐渐缩小,分组数逐渐减少,而各组的记录数目逐渐增多,但由于文

15、件较近于有序状态,所以新的的记录数目逐渐增多,但由于文件较近于有序状态,所以新的一趟排序过程也较快。因此,希尔排序在效率上较直接接入排一趟排序过程也较快。因此,希尔排序在效率上较直接接入排序有较大的改进。它的时间复杂度为序有较大的改进。它的时间复杂度为O(n1.3)。q 希尔排序性能分析希尔排序性能分析安安徽徽理理工工大大学学1. 子文件(子序列)的构成不是简单地子文件(子序列)的构成不是简单地“逐段分割逐段分割”,而是将,而是将相隔某个相隔某个“增量增量”的记录组成一个子文件。的记录组成一个子文件。2. 增量序列应是递减,且最后一个必须为增量序列应是递减,且最后一个必须为1。3. 希尔排序法

16、是不稳定的(由于希尔排序对每个子序列单独比希尔排序法是不稳定的(由于希尔排序对每个子序列单独比较,在比较时进行元素移动,有可能改变相同关键字元素的原较,在比较时进行元素移动,有可能改变相同关键字元素的原始顺序,因此希尔排序是不稳定的)。始顺序,因此希尔排序是不稳定的)。q 希尔排序特点希尔排序特点安安徽徽理理工工大大学学10.3 快速排序快速排序1. 起泡排序起泡排序基本思想:基本思想:首先将第一个记录的关键字和第二个记录的关键字首先将第一个记录的关键字和第二个记录的关键字进行比较,若为逆序,则将两个记录交换之,然后比较第二个进行比较,若为逆序,则将两个记录交换之,然后比较第二个记录和第三个记

17、录的关键字。依次类推,直至第记录和第三个记录的关键字。依次类推,直至第n-1个记录和第个记录和第n个记录的关键字进行过比较为止。上述过程称作个记录的关键字进行过比较为止。上述过程称作第一趟起泡第一趟起泡排序排序,其结果使得关键字最大的记录被安置到最后一个记录的,其结果使得关键字最大的记录被安置到最后一个记录的位置上。然后进行第二趟起泡排序,对前位置上。然后进行第二趟起泡排序,对前n-1个记录进行同样操个记录进行同样操作,其结果使得关键字次大的记录被安置到第作,其结果使得关键字次大的记录被安置到第n-1个记录的位置个记录的位置上。第上。第i趟起泡排序是从趟起泡排序是从L.r1到到L.rn-i+1

18、依次比较相邻两个记依次比较相邻两个记录的关键字,并在逆序时交换到第录的关键字,并在逆序时交换到第n-i+1的位置上。判别起泡排的位置上。判别起泡排序结束条件是:序结束条件是:在一趟排序过程中没有进行过交换记录的操作。在一趟排序过程中没有进行过交换记录的操作。安安徽徽理理工工大大学学初始关键字:初始关键字: 49 38 65 97 76 13 27 49第一趟排序后:第一趟排序后:38 49 65 76 13 27 49 97第二趟排序后:第二趟排序后:38 49 65 13 27 49 76第三趟排序后:第三趟排序后:38 49 13 27 49 65第四趟排序后:第四趟排序后:38 13 2

19、7 49 49第五趟排序后:第五趟排序后:13 27 38 49第六趟排序后:第六趟排序后:13 27 38q 起泡排序示例起泡排序示例安安徽徽理理工工大大学学void BubbleSort(SqList &L) int i, j, tag; j = L.length-1; do tag=1; for(i=1; i=j; i+) if( L.ri+1.key L.ri.key ) L.r0= L.ri+1; L.ri+1= L.ri; L.ri= L.r0; tag=0; if( !tag ) j-; while( !tag &j ); return; q 起泡排序算法起泡排序

20、算法安安徽徽理理工工大大学学 在对象的初始排列已经按关键字从小到大排好序时,此算法在对象的初始排列已经按关键字从小到大排好序时,此算法只执行一趟起泡,做只执行一趟起泡,做 n-1 次关键字比较,不移动对象。这是最次关键字比较,不移动对象。这是最好的情形。好的情形。 最坏的情形是算法执行了最坏的情形是算法执行了n-1趟起泡,第趟起泡,第 i 趟趟 (1 in) 做了做了 n- i 次关键字比较,执行了次关键字比较,执行了n-i 次对象交换。总的时间复杂度为次对象交换。总的时间复杂度为O(n2)。 起泡排序是一个稳定的排序方法。起泡排序是一个稳定的排序方法。q 起泡排序算法分析起泡排序算法分析安安

21、徽徽理理工工大大学学v 基本思想:基本思想:通过一趟排序将待排记录分割成独立的两部分,通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。分别对这两部分记录继续进行排序,以达到整个序列有序。v 一趟快速排序:一趟快速排序:首先选取一个记录(通常选取第一个记录)首先选取一个记录(通常选取第一个记录)作为界点,然后将所有关键字较它小的记录都安置在它的位置作为界点,然后将所有关键字较它小的记录都安置在它的位置之前,将所有关键字较它大的记录都安置在它的位

22、置之后。由之前,将所有关键字较它大的记录都安置在它的位置之后。由此以该此以该“界点界点”记录最后所落的位置记录最后所落的位置i为分界线,将整个序列分为分界线,将整个序列分割成两个子序列。割成两个子序列。 然后分别对这两个子序列重复施行上述方法,直到所有的然后分别对这两个子序列重复施行上述方法,直到所有的对象都排在相应位置上为止。对象都排在相应位置上为止。2. 快速排序快速排序安安徽徽理理工工大大学学v 附设两个指针附设两个指针low和和high,其初值分别指向数组的单元,其初值分别指向数组的单元1和单和单元元n。选择第一个记录为界点,其关键字为。选择第一个记录为界点,其关键字为pivotkey

23、。将。将pivotkey复制到复制到r0中,从中,从high所指的位置起向前搜索找到第一所指的位置起向前搜索找到第一个关键字小于个关键字小于pivotkey的记录复制到的记录复制到low所指位置中,然后从所指位置中,然后从low所指位置起向后搜索,找到第一个关键字大于所指位置起向后搜索,找到第一个关键字大于pivotkey的记的记录复制到录复制到high所指位置中,重复这两步直到所指位置中,重复这两步直到lowhigh为止。为止。v快速排序是对冒泡排序的一种改进方法,算法中元素的比较快速排序是对冒泡排序的一种改进方法,算法中元素的比较和交换是从两端向中间进行的,关键字较大的元素一次就能够和交换

24、是从两端向中间进行的,关键字较大的元素一次就能够交换到后面单元,关键字较小的记录一次就能够交换到前面单交换到后面单元,关键字较小的记录一次就能够交换到前面单元,记录每次移动的距离较远,因而总的比较和移动次数较少。元,记录每次移动的距离较远,因而总的比较和移动次数较少。q 具体做法具体做法安安徽徽理理工工大大学学 0 1 2 3 4 5 6 7 82738659776132749*第一次交换第一次交换lowhigh49 0 1 2 3 4 5 6 7 82738659776136549*第二次交换第二次交换lowhigh49q 具体实现过程具体实现过程 0 1 2 3 4 5 6 7 84938

25、659776132749*初始关键字初始关键字pivotkeylowhigh49安安徽徽理理工工大大学学 0 1 2 3 4 5 6 7 82738139776136549*第三次交换第三次交换lowhigh49 0 1 2 3 4 5 6 7 82738139776976549*第四次交换第四次交换lowhigh49 0 1 2 3 4 5 6 7 82738134976976549*第一趟完成第一趟完成low high49q 具体实现过程具体实现过程 0 1 2 3 4 5 6 7 82738659776136549*第二次交换第二次交换lowhigh49安安徽徽理理工工大大学学q 快速排

26、序全过程快速排序全过程 初始状态初始状态 49 38 65 97 76 13 27 49 一趟快速排序后一趟快速排序后 27 38 13 49 76 97 65 49 分别进行快速排序分别进行快速排序 13 27 38 结束结束结束结束 49 65 76 97 49 65 结束结束结束结束 有序序列有序序列 13 27 38 49 49 65 76 97 整个快速排序过程可整个快速排序过程可递归进行递归进行安安徽徽理理工工大大学学 int Partition(SqList &L, int low, int high) L.r0 = L.rlow; pivotkey = L.rlow.k

27、ey; while (low high) while (low= pivotkey) -high; L.rlow = L.rhigh; while (lowhigh & L.rlow.key = pivotkey) +low; L.rhigh = L.rlow; L.rlow=L.r0; return low; q 一趟快速排序算法实现一趟快速排序算法实现安安徽徽理理工工大大学学void QSort(SqList &L, int low, int high) if (low high) pivotloc = Partition(L,low,high); QSort(L,low,

28、 pivotloc-1); QSort(L,pivotloc+1, high); void QuickSort(SqList &L) QSort(L,1,L.length); q 递归形式的快速排序算法递归形式的快速排序算法安安徽徽理理工工大大学学 从时间上看,快速排序平均计算时间是从时间上看,快速排序平均计算时间是O(nlog2n)。实。实验结果表明验结果表明: 就平均计算时间而言就平均计算时间而言, 快速排序是所有内排序快速排序是所有内排序方法中最好的一个。在最坏的情况方法中最好的一个。在最坏的情况, 即待排序对象序列已即待排序对象序列已经按其排序码从小到大排好序的情况下,其时间复

29、杂度为经按其排序码从小到大排好序的情况下,其时间复杂度为O(n2)。 从空间上看,快速排序是递归的,最大递归调用层次从空间上看,快速排序是递归的,最大递归调用层次数与递归树的高度一致,理想情况为数与递归树的高度一致,理想情况为 log2(n+1) 。因此,。因此,要求存储开销为要求存储开销为 O(log2n)。 快速排序是一种不稳定的排序方法。快速排序是一种不稳定的排序方法。q 算法分析算法分析安安徽徽理理工工大大学学10.4 选择排序选择排序选择排序的基本思想是:选择排序的基本思想是: 每一趟每一趟 (例如第例如第 i 趟,趟,i = 1, , n-1) 在后面的在后面的 n-i+1 个待排

30、序对象中选出关键字最小的对象,作为有序对象序个待排序对象中选出关键字最小的对象,作为有序对象序列的第列的第 i 个对象。待到第个对象。待到第 n-1 趟作完,待排序对象只剩下趟作完,待排序对象只剩下1个,就不用再选了。个,就不用再选了。安安徽徽理理工工大大学学1.1.简单选择排序简单选择排序v 基本步骤为:基本步骤为:i从从1开始,直到开始,直到n-1,进行,进行n-1趟排序,第趟排序,第i 趟的趟的排序过程为:排序过程为: 在一组对象在一组对象rirn(i=1,2,n-1)中选择具有)中选择具有最小关键字的对象,并和第最小关键字的对象,并和第 i 个对象进行交换。个对象进行交换。void S

31、electSort( SqList &L ) for( i =1; i L.length; +i ) j = SelectMinKey( L, i ); if ( i != j ) L.ri L.rj; /SelectSort安安徽徽理理工工大大学学q 算法分析算法分析 直接选择排序的排序码比较次数与对象的初始排列无关。设直接选择排序的排序码比较次数与对象的初始排列无关。设整个待排序对象序列有整个待排序对象序列有 n 个对象个对象, 则第则第 i 趟选择具有最小排序码趟选择具有最小排序码对象所需的比较次数总是对象所需的比较次数总是 n-i-1 次。总的排序码比较次数为次。总的排序码比较

32、次数为n(n-1)/2。 对象的移动次数与对象序列的初始排列有关。当这组对象的对象的移动次数与对象序列的初始排列有关。当这组对象的初始状态是按其排序码从小到大有序的时候初始状态是按其排序码从小到大有序的时候, 对象的移动次数为对象的移动次数为0,达到最少。达到最少。 最坏情况是每一趟都要进行交换,总的对象移动次数为最坏情况是每一趟都要进行交换,总的对象移动次数为 3(n-1)。 直接选择排序是一种不稳定的排序方法。直接选择排序是一种不稳定的排序方法。安安徽徽理理工工大大学学2.2.堆排序堆排序堆的定义:堆的定义:n个元素的序列个元素的序列 k1,k2,kn ,当且仅当满足,当且仅当满足以下关系

33、时:以下关系时: ki = k2i ki = k2i+1 其中其中i=1,2, n/2 ,则称此则称此n个元素的关键字个元素的关键字k1,k2,kn为一个堆。为一个堆。 解释:解释:如果让满足以上条件的元素序列如果让满足以上条件的元素序列 k1,k2,kn 顺顺次排成一棵完全二叉树,则此树的特点是:次排成一棵完全二叉树,则此树的特点是: 树中所有结点的值均大于(或小于)其左右孩子,此树的根树中所有结点的值均大于(或小于)其左右孩子,此树的根结点(即堆顶)必最大(或最小)。结点(即堆顶)必最大(或最小)。 或或安安徽徽理理工工大大学学q 大根堆和小根堆大根堆和小根堆(a)小根堆)小根堆 (b)大

34、根堆)大根堆09651723 45 78 87533187537845 65 09 311723(09,17,65,23,45,78,87,53,31) (87,78,53,45,65,09,31,17,23)安安徽徽理理工工大大学学 以初始关键字序列,建立堆;以初始关键字序列,建立堆; 输出堆顶元素;输出堆顶元素; 调整余下的元素,使其成为一个新堆;调整余下的元素,使其成为一个新堆; 重复、重复、 n 次,得到次,得到 一个有序序列。一个有序序列。关键要解决和,即:关键要解决和,即:如何由一个无序序列如何由一个无序序列建成一个堆?建成一个堆?如何在输出堆顶元素如何在输出堆顶元素之后调整剩余元

35、素成之后调整剩余元素成为一个新的堆?为一个新的堆?q 堆排序基本思想堆排序基本思想安安徽徽理理工工大大学学v 调整方法调整方法(以小根堆为例)(以小根堆为例)13273849 76 65 499797273849 76 65 491327973849 76 65 491327493849 76 65 9713 将堆顶元素和堆的最后一个元素位置交换;将堆顶元素和堆的最后一个元素位置交换; 然后以当前堆顶元素和其左、右子树的根结然后以当前堆顶元素和其左、右子树的根结点进行比较(此时,左、右子树均为堆),并点进行比较(此时,左、右子树均为堆),并与值较小的结点进行交换;与值较小的结点进行交换; 重复

36、,继续调整被交换过的子树,直到叶重复,继续调整被交换过的子树,直到叶结点或没进行交换为止。称这个调整过程为结点或没进行交换为止。称这个调整过程为筛筛选选。 安安徽徽理理工工大大学学void HeapAdjust(HeapType &H,int s,int m)/*已知已知H.rs.m中记录的关键字除中记录的关键字除H.rs.key之外均满足堆定义之外均满足堆定义,本函数调整,本函数调整H.rs的关键字,使的关键字,使H.rs.m成为一个小根堆。成为一个小根堆。*/ rc=H.rs; for ( j=2*s;j=m;j*=2) if (j0; -i) HeapAdjust(H,i,H.l

37、ength); for (i=H.length;i1; -i) temp=H.r1; H.r1=H.ri; H.ri=temp; HeapAdjust(H,1,i-1); v 堆排序算法堆排序算法安安徽徽理理工工大大学学 在整个堆排序中,共需要进行在整个堆排序中,共需要进行 n/2+n-1 次筛选运算,每次筛次筛选运算,每次筛选运算进行双亲和孩子或兄弟结点的关键字的比较和移动次数选运算进行双亲和孩子或兄弟结点的关键字的比较和移动次数都不会超过完全二叉树的深度,所以,每次筛选运算的时间复都不会超过完全二叉树的深度,所以,每次筛选运算的时间复杂度为杂度为O(log2n),故整个堆排序过程的时间复杂

38、度为,故整个堆排序过程的时间复杂度为O(nlog2n)。 堆排序不适合记录较少的文件,是一种不稳定的排序方法。堆排序不适合记录较少的文件,是一种不稳定的排序方法。 该算法的附加存储主要是在第二个该算法的附加存储主要是在第二个for循环中用来执行对象交循环中用来执行对象交换时所用的一个临时对象。因此,该算法的空间复杂性为换时所用的一个临时对象。因此,该算法的空间复杂性为O(1)。v 算法分析算法分析安安徽徽理理工工大大学学归并:归并:是将两个或两个以上的有序表合并成一个新的有序表。是将两个或两个以上的有序表合并成一个新的有序表。归并的基本操作是将两个位置相邻的有序记录子序列归并的基本操作是将两个

39、位置相邻的有序记录子序列R i . m 和和R m+1 . n 归并成一个有序记录序列归并成一个有序记录序列R i . n 。 2-路归并排序:路归并排序: 基本思想:将两个有序子区间(有序表)合并成一个有序基本思想:将两个有序子区间(有序表)合并成一个有序子区间,一次合并完成后,有序子区间的数目减少一半,而区子区间,一次合并完成后,有序子区间的数目减少一半,而区间的长度增加一倍,当区间长度从间的长度增加一倍,当区间长度从1增加到增加到n(元素个数)时,(元素个数)时,整个区间变为一个,则该区间中的有序序列即为我们所需的排整个区间变为一个,则该区间中的有序序列即为我们所需的排序结果。序结果。

40、10.4 归并排序归并排序安安徽徽理理工工大大学学例如,已知关键字例如,已知关键字46,55,13,42,94,05,17,70,给出,给出二路归并排序过程。二路归并排序过程。 初始状态:初始状态:46 55 13 42 94 05 17 70 一趟归并:一趟归并:46 55 13 42 05 94 17 70 二趟归并:二趟归并:13 42 46 55 05 17 94 70 三趟归并:三趟归并:05 13 17 42 46 55 70 94v 归并过程归并过程安安徽徽理理工工大大学学 二路归并排序的时间复杂度等于归并趟数与每一趟时间复二路归并排序的时间复杂度等于归并趟数与每一趟时间复杂度的乘积。而归并趟数为杂度的乘积。而归并趟数为 log2n ,每一趟归并的时间复杂度,每一趟归并的时间复杂度为为O(n)。因此,二路归并排序的时间复杂度为。因此,二路归并排序的时间复杂度为O(nlog2n)。 利用二路归并排序时,需要利用与待排序数组相同的辅助利用二路归并排序时,需要利用与待排序数组相同的辅助数组作临时单元,故该排序方法的空间复杂度为数组作临时单元,故该排序方法的空间复杂度为O(n),比前面,比前面介绍的其它排序方法占用的空间大。介绍的其它排序方

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论