考虑以下问题:
我们有两个数组
A
和B
,以便对A
和B
进行排序 除A
之外附加了B.length
个附加0。例如,A
和B
可能如下:A = [2, 4, 6, 7, 0, 0, 0] B = [1, 7, 9]
我们的目标是通过插入
B
的每个条目来创建一个排序列表 进入A
到位。例如,在上面运行算法 例子会离开A = [1, 2, 4, 6, 7, 7, 9]
有一种聪明的方法比O(n ^ 2)时间更好吗?我能想到的唯一方法是通过线性扫描并执行适当数量的移位将B
的每个元素插入A
,但这会导致O(n ^ 2)解。
答案 0 :(得分:0)
您可以在O(n)
。
从最后开始工作,将最大元素移到A
的末尾。这样,您可以避免在迭代时保留元素的位置有很多麻烦。这很容易实现:
int indexA = A.Length - B.Length - 1;
int indexB = B.Length - 1;
int insertAt = A.Length;
while (indexA > 0 || indexB > 0)
{
insertAt--;
A[insertAt] = max(B[indexB], A[indexA]);
if (A[indexA] <= B[indexB])
indexB--;
else
indexA--;
}
答案 1 :(得分:0)
一些伪代码(sorta C-ish),假设数组索引是基于0的:
pA = A + len(A) - 1;
pC = pA; // last element in A
while (! *pA) --pA; // find the last non-zero entry in A
pB = B + len(B) - 1;
while (pA >= A) && (pB >= B)
if *pA > *pB
*pC = *pA; --pA;
else
*pC = *pB; --pB;
--pC
while (pB >= B) // still some bits in B to copy over
*pC = *pB; --pB; --pC;
没有真正经过测试,只是写下了我的头脑,但它应该给你的想法......可能没有完全正确的终止和边界条件。