本题为《剑指Offer》“面试题4:替换空格”一节中的“相关题目”。
有两个排序的数组A1和A2,内存在A1的末尾有足够多的空余空间容纳A2。请实现一个函数,把A2中的所有数字插入到A1中并且所有数字是排序的。
分析
其实这道题就是实现一个归并排序,只是在数组中,数据是顺序存储的,如果在数组头部进行归并排序,每一次操作都会移动后面所有的数据,开销很大。所以应该从尾部进行操作。
//两个数组的初始实际长度是固定,而数组a2也不需要进行改动,所以都可以声明为常量,进行保护。
//题目中已经说明空间足够,不然还需要再声明一个参数length,表示合并后a1的维度,
//并与a1,a2的初始长度之和进行比较,以防越界。
auto insertArray(int *a1, const int length1, const int *a2, const int length2) -> void
{
//思想:从后往前
//i,j为a1,a2数组实际末尾下标,k为a1数组中进行归并位置的下标
int i = length1 - 1, j = length2 - 1, k = length1 + length2 - 1;
while(i >= 0 && j >= 0)
{
//如果a1数组中未处理末尾的数大于或等于a2数组中未处理末尾的数,
//则将a1的该位置的数插入到a1数组末尾,否则插入a2该位置的数
if(a1[i] >= a2[j])
{
a1[k--] = a1[i--];
}
else
{
a1[k--] = a2[j--];
}
}
//如果数组a2中还有元素没有插入到数组a1中,则全部依次插入到数组a1前面位置
while(j >= 0)
{
a1[k--] = a2[j--];
}
}