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++;
}
}
}