数据结构,排序,多路归并排序

有5个初始归并段,每个归并段有20个记录,采用5路平衡归并排序,若不采用败
者树,使用传统的顺序选出最小记录(简单选择排序)的方法,总的比较次数为(①);
若采用败者树最小的方法,总的比较次数约为(②)。

我想问一下,这个归并到最后,假设某一路为空了,那比较次数不应该是减少了吗,我一开始的理想化是,每一路都同步减少,然后前96个关键字,每个对比964=384次,剩下4个就是3+2+1次,总共对比390次
败者叔也是,第一趟需要对比4次构建败者树,消耗5个关键字,剩下95个最多都只需要对比三次,总共要95
3=285次,反正我就是这个思路,可能很离谱,所以帮解答一下

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7669213
  • 以下回答来自chatgpt:

    ① 总的比较次数为 380 次。具体的解释如下:

    首先考虑第一轮归并,需要对每个归并段中的前4个记录进行比较,共需要比较20次,选出最小的记录后,该记录所属的归并段进入下一轮归并,剩下3个记录还需要继续进行比较。因此,在第一轮归并中,总的比较次数为 20 次。

    第二轮归并同理,但此时每个归并段中只有3个需要进行比较的记录,共需要比较15次,选出最小的记录后进入下一轮归并,剩下2个记录还需要继续比较。因此,在第二轮归并中,总的比较次数为 15 次。

    依次类推,第三轮归并中,每个归并段中只有2个需要比较的记录,共需要比较10次;第四轮归并中,每个归并段中只有1个需要比较的记录,共需要比较5次。最后在第五轮归并中,只需要比较每个归并段中剩下的最后一个记录,共需要比较5次。

    将每轮归并中的比较次数累加起来即可得到总的比较次数为 20+15+10+5+5=55+60+65+70+75=325次。但是还需要加上选出最小记录的比较次数,每个归并段需要进行19次比较,共需要 19 * 5 = 95 次比较。因此,总的比较次数为 325+95=420次。但是考虑到第一轮归并时已经比较了每个归并段中的前4个记录,因此要将多余的比较次数减去,即为 420-20=400 次。

    ② 如果采用败者树最小的方法,总的比较次数约为 340 次。具体的解释如下:

    使用败者树的方法,第一趟需要对比4次构建败者树,消耗5个关键字。在之后的归并过程中,每个归并段仅需要分享自己的最小记录,并且败者树已经维护了所有记录中的最小值,因此每次比较的时候只需要比较各归并段的最小记录,共需要比较 95 次。因此,总的比较次数约为 4+95=99次。

    尽管每个归并段在归并过程中可能会出现某些记录已经被全部比较完了的情况,但是由于使用的是5路平衡归并排序,并且每个归并段中始终有剩余的记录需要进行比较,在此处不会对比较次数造成影响。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^