合并两个有序数组(哨兵)

如何实现这个算法呢?可以把各种情况都考虑进去,这样有利于分析问题,两个有序的数组排序是否一致,是否一样大,实现的时候把效率考虑进去。

  • 两个数组排序一致吗?
  • 两个数组一样吗?

是否都是升序或者降序,不能出现一个升序和一个降序。两个数组大小没有限制的,但是再算法实现时要考虑进去,具体讲算法。

有两个思路,

  • 从一个数组复制到另外一个数组,再复制的过程中,把数据插入到相应的位置。需要扩容其中一个数组,不然放不下,空间复杂度O(数组的大小),时间复杂度为O(n^2),交换次数n*n。
  • 申请一个临时数组,将两个数组按照顺序放在临时数组中,空间复杂度未O(两个数组长度之和),时间复杂度为O(n),无交换次数。

从理论上分析,肯定时采用第二种策略,毕竟为了获取更好的时间复杂度,不care这点空间,毕竟内存都这么大,哈哈哈。

  • 为两个数组设置两个哨兵,排除放到临时数组之前,首先要比较两个哨兵的大小,为了更好的描述过程,我们把两个数组的哨兵叫做pa,pb。若是pa<pb,则讲pa放入临时数组中,然后pa往前走一步,pb不动。若是pa>pb,则pb往前走步一步,pa不动。
  • 还有一个情况就是两个数组中肯定有个先走完的,所以在最后判断哪个未走完,未走完的需要讲它全部放在临时数组中,为啥因为数组都是有序的。

废话不多说,见下面代码:

private static int[] mergeList(int[] AList, int[] BList) {
        int pivotA = 0;//数组AList 哨兵
        int pivotB = 0;//数组BList 哨兵
        int aLength = AList.length;//数组AList长度
        int bLength = BList.length;//数组BList长度

        int[] temp = new int[20];

        int index = 0;

        /**
         * 对比哨兵的大小,来判断是否往前走。
         */
        while (pivotA < aLength && pivotB < bLength) {
            if (AList[pivotA] <= BList[pivotB]) {
                temp[index++] = AList[pivotA];
                pivotA++;
            } else {
                temp[index++] = BList[pivotB];
                pivotB++;
            }
        }

        /**
         * 判断两个数组,哪个未走完,未走完的直接放在临时数组中。
         */
        if (pivotA < aLength) {
            for (int j = pivotA; j < aLength; j++) {
                temp[index++] = AList[j];
            }
        }

        if (pivotB < bLength) {
            for (int j = pivotA; j < bLength; j++) {
                temp[index++] = BList[j];
            }
        }
        return temp;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

技术人Howzit

钱不钱的无所谓,这是一种鼓励!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值