k路归并算法的分析和实现

问题描述

    将k个已经排序的数组归并成一个大的排序的结果数组。这些数组可能数量比较大,以至于不能直接装载到内存中。

    这个问题比较有意思。后面一截的描述是我个人加上去的。实际上一个简单的模型就是将k个已经排好序的数组或者序列合并成一个排好序的结果数组。那么我们该怎么来考虑这个问题呢?

 

初步分析

    其实这个问题可以说是一个问题的更加普遍形式。回顾一下我们在讨论归并排序的时候。那时候我们是将一个数组分解成两个子序列进行排序,然后再进行归并。这个过程一直递归下去。而其中归并结果的过程正好就是将两个已经排好序的序列合并成一个排好序的数组。我们可以看下面这一部分代码来回顾一下当时的实现:

public static void merge(int[] a, int start, int middle, int end)
{
    int[] array = new int[end - start + 1];
    int i = 0, j = start, k = middle + 1;
    while(j <= middle && k <= end)
    {
	if(a[j] <= a[k])
	    array[i++] = a[j++];
	else
	{
	    count += middle - j + 1;
	    array[i++] = a[k++];
	}
    }
    while(j <= middle)
	array[i++] = a[j++];
    while(k <= end)
	array[i++] = a[k++];
    for(i = 0; i < array.length; i++)
	a[start + i] = array[i];
}

     我们可以看到对于两个序列来说,我们可以通过遍历两个序列,一直比较两个序列中最前面的元素,然后取更加小的那个,这样直到一个序列已经取完了。我们再把还有剩余元素的序列遍历取出来。

    这是两个序列的归并,可是如果扩展到多个序列的情况,我们该怎么来调整呢?

 

思路

    k个数组的元素都已经排好序了,假设所有数组的元素总和为n。我们只要不停的遍历所有数组,从每个数组里面从头到尾的去取,然后把每次得到的最小的元素取出来就可以。这样,我们就很容易得到一个解决办法。

方法一:循环遍历

    这个办法的思路就比较直接,首先,我们比较所有k个数组的头一个元素,找

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值