Merge In Place

昨天和战神研究出了一个新的就地merge两个数组的算法,可能是已有的。

空间复杂度是O(1), 时间复杂度最坏可能会达到O(n^2)

算法保证每次循环结束之后a[i…k] 和a[j…n-1] 分别是有序的,这样其实是包含了原问题的子问题,还可以尝试递归。

之前保证a[i] a[j]中存在未处理数组里最小的数 可能会有问题,因此后面还是需要有个while将比交换过来的数更小的数都遍历到底

void f(int *a, int k, int n)
{
    int i=0, j=k+1;
    while(i<=k && j<=n-1)
    {
        if(a[i]>a[j])
        {
            swap(a[i],a[j]);
            int l=j+1,tmp=a[j];
            while(l<=n-1 && tmp>a[l])
                a[l-1]=a[l],l++;
            a[l-1]=tmp;
            i++;
        }
        else
        {
            i++;
        }
    }
}

Posted by richard爱闹 - 9月 12 2014
如需转载,请注明: 本文来自 Richard