归并排序-败者树

本文介绍了如何利用败者树优化k路归并排序,详细讲解了败者树的结构特点和初始化过程,并提供了一个5路归并排序的C语言实现示例,展示了如何在每次迭代中通过败者树找到最小值,从而降低比较次数,提高效率。
摘要由CSDN通过智能技术生成

k路归并,则每得到有序串的下一个元素,若按传统的归并方法,则需要(k-1)次比较(找到k个元素中的最小值),然而若采用败者树的方法,每得到有序串的下一个元素仅需归并排序-败者树次比较。

 

败者树的主要特点有:1、败者树有k个叶子节点,每个叶子节点分别存放需要归并的k个归并串的当前值。需要一个辅助的节点来存放关键字可能的最小值,这个辅助节点是在初始化败者树的时候用到。

                    2、每个非叶子节点中分别存放的是其两个子树中的胜者中的败者的编号(两个胜者分别对应其左右子树的胜者,这两个胜者中的败者的编号存放在该节点中)。根节点的“父节点”(根节点的前一个节点)用来保存k个值中的胜者。

 

归并排序_败者树算法的可描述为:1、初始化(得到初始化败者树)并得到k个值中的胜者。2、取下胜者加入有序输出结果,并改变胜者对应归并串的当前值。3、调整(从上一个胜者对应的归并串开始走到树根即可)得到新的败者树.....2、3循环......直到得到的胜者是关键字的最大值(为了防止某个归并段变空,可以在每个归并段中附加一个关键字为最大值的记录,当选出的“冠军”记录的关键字为最大值时,表明此次递归完成)。

败者树的初始化也容易实现,只要先令所有的非终端节点指向一个含最小关键字的辅助节点(最后一个叶子节点的下一个节点),然后从各个叶子节点出发调整非终端节点为新的败者即可。并且初始化完成后得到第一个最小值(胜者)。

 

关于5路归并败者树,一个C语言的实现如下:
#include<stdio.h>
#include<limits.h>    //这个头文件中包含INT_MAX、INT_MIN等变量。

 

  

typedef int losertree[5];//所有非叶子节点结构,k路归并就是k个元素的数组,每个元素代表一个非叶子节点
typedef struct   
{
        int keyvalue;
}external[6];      //所有叶子节点结构(结构体的数组,假如是k路归并,则此结构体数组中就含有k+1个元素,最后一个元素external[k]用来存放比关键字可能的最小值还要小的关键字,external[k]在创建败者树的时候使用),每个结构体代表一个叶子节点

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值