1、第9章排序9.6堆排序2021/2/24 1 锦标赛排序方法对比简单选择排序算法减少了许多排序时间,但是使用了较多的附加存储。 如果有n 个对象,必须使用至少2n-1 个结点来存放胜者树。最多需要找到满足2k-1 n2k 的k,使用2*2k-1 个结点。每个结点包括关键码、对象序号和比较标志三种信息。锦标赛排序算法性能分析堆排序(Heap Sort) 利用堆数据结构,即可以利用树形结构存储比较结果的历史,还可以减少算法的辅助存储空间的数量 堆排序分 个 , 据 数据,利用堆的 算法 n 形 堆 , 的对象 和 堆排序。212525*4916 080123 4 5i 212525* 164908
2、025431i21 25 49 25* 16 08初始关键码集合21 25 49 25* 16 08i= 2 时的局部调整建立初始大根堆过程212525*4916 080123 4 5i492525* 16210802543121 25 49 25* 16 08 49 25 21 25* 16 08i= 0 时的局部调整形成最大堆i= 1 时的局部调整建立初始大根堆过程大根堆的向下调整算法template voidcurrency1 : n const int “ const intnficurrency1 intfl n ;intfl 2* 1;Type ;while fl nficurre
3、ncy1 if fl 1 nficurrency1 & fl ” = heapchild.getKey( ) )break;else heapcurrent = heapchild;current= child;child= 2*child+1;heapcurrent = temp;大根堆的向下调整算法(1)将数组中存储的元素转换成初始大根堆for( inti= ( CurrentSize-2)/2 ; i= 0;i-)FilterDown( i, CurrentSize-1 );(2)利用初始的大根队进行排序堆排序的算法思想 最堆的 个对象 有最的关键码, n对 , 有最关键码的对象 到最
4、对的n-1个对象,使用堆的 算法 n “ n-1 ,最堆。结果 有最关键码的对象 到堆 ,即 。 对 和 n-1, 用 n “ n-2 ,对n-2个对象 ,。 如 ,最 到 排序 的对象序 。利用初始的大根堆排序的思想492525*2116 080123 4 5082525* 16214902543149 25 21 25* 16 08 08 25 21 25* 16 49 0 号 号对象“ 号对象 最堆大根堆排序的过程2021/2/24 112525*082116 490123 4 51625*08 25214902543125 25* 21 08 16 49 16 25* 21 08 25
5、 49 0 号 号对象“ 号对象 号到 号 最堆2021/2/24 1225*16082125 490123 4 5081625* 25214902543125* 16 21 08 25 49 08 16 21 25* 25 49 0 号 号对象“ 号对象 号到 号 最堆2021/2/24 13211625*0825 490123 4 5081625* 25214902543121 16 08 25* 25 49 08 16 21 25* 25 49 0 号 2 号对象“2 号对象 号到2 号 最堆2021/2/24 14160825*2125 490123 4 5081625* 252149
6、02543116 08 21 25* 25 49 08 16 21 25* 25 49 0 号 1 号对象“1 号对象 号到1 号 最堆2021/2/24 15template voidcurrency1 :currency1 /对表heap0到heapn-1进行排序, 使得表中各/个对象按其关键码非递减有序。for int n -2 2; ; - n “ n -1 ; /初始堆for n -1; 1; - “ ; /交换 n “ -1 ; /重建最大堆 堆排序算法的实现堆排序算法性能分析 若设堆中有n 个结点,且2k-1n2k,则对应的完全二叉树有k 层。在第i层上的结点数 2i (i= 0, 1, , k-1)。在第一个形成初始堆的for循环中对每一个非叶结点调用了一次堆调整算法FilterDown( ),因此该循环所用的计算时间为: 其中,i是层序号,2i 是第i层的最大结点数,(k-i-1)是第i层结点能够移动的最大距离。( )-=-2022kiiik ,在第二个for循环中,调用了n-1次FilterDown( )算法,该循环的计算时间为O(nlog2n)。因此,堆排序的时间复杂性为O(nlog2n)。算法的空间复杂性为O(1)。堆排序是一个不稳定的排序方法。njnjjikkjkjjjkkjjkkii/=- -=-=-=-=11111111202222222122 )(