2变式:两有序数组合并

本题为《剑指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--];
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值