基本思想: 使用递归将队列分裂后的子队列中数据(原队列的一半和另一半)进行逐式比较,将较小的队首写入缓冲区,不断递归,直到使整个队列的数据在写入的缓冲区中是有序的。
(逐式比较: 将队列1和队列2的队首元素进行大小的比较,小的写入缓冲区数据队列的末尾,依次进行比较,直到两个队列元素全部写入缓冲区为止)
2.对于空间复杂度的思考
二路归并排序的空间复杂度是待排数据队列的大小,即O(n).但是这部分空间不需要在内存中开辟,在逐式比较时的只要对两个元素读入内存进行比较(对于k路归并,就是k个元素)。在逐式比较之后将较小者直接写入外部存储器,从而实现了外部排序。
3.对于排序方法的思考
在上面的方法中,对每一层分割得到的两个待排序的队列都分别又采取了二路归并排序,因而是完全的彻底的二路归并排序算法; 但实际上当分割后剩下的两个部分长途足够小,内存可以装下时,就可以采用效率更高的内部排序算法,对该队列进行内部排序,然后再递归回溯到上一层,继续回到二路归并排序,实现算法的最优解。
4.对于归并分路数目的思考
二路归并排序只对两个元素进行比较,每一趟比较叫做一趟归并,二路归并排序递归过程的最底层(第一次)是两两进行比较,比较的趟数最多,每一趟都要进行外存的读写; 如果对每一次所做的比较,增加比较元素的个数(即增大k),就可以减少归并的趟数,减少外存读写,提高时间上的效率。但是随着k的增大,比较的次数也会增加,时间上的效率不再提高; 采用败者树,对待比较的分割后的小序列进行比较上的选择,可以让比较次数与k无关,从而真正提高效率。败者树在每一次对k个元素进行比较时都要创建,k个元素被写入k个叶子节点,
5.关于败者树
败者树是一个完全二叉树,它的作用是选出所有叶子节点中的最小者,过程如下:将叶子节点中的数据与它的兄弟比较,大的作为败者,记录在父亲节点中,小的作为胜者,上升到上一层进行下一次比较。最终的胜出者脱离二叉树(一般被保存在数组的第0位置,而根节点被保存在1位置),从而最小的叶子节点被筛选出来。在归并排序中,将k个序列的队首作为叶子节点,建立败者树,筛选出最小的叶子节点,保证了比较次数不会随k增加。
243



被折叠的 条评论
为什么被折叠?



