合并已排序的数组

条件:

两个数组分别已经升序排列。

要求:

合并两个数组并返回新的已经排序后的数组。

分析该题目,其要求与归并排序的实现思想相同。

归并排序的算法中,使用“分治”策略,而这道题的实现逻辑,仅需要用到归并算法中的“治”。

function mergeArray(first, sec) {
  var temp = new Array(first.length + sec.length)
  var t = 0


  var i = 0
  var j = 0
  // 取较短的数组作为loop条件
  var mid = (first.length <= sec.length) ? first.length - 1 : sec.length - 1
  while (i <= mid && j <= mid) {
    //关键的逻辑在于这行
    temp[t++] = (first[i] < sec[j]) ? first[i++] : sec[j++]
  }


  // 将first数组中剩余的元素追加到temp
  while (i <= first.length - 1) {
    temp[t++] = first[i++]
  }
  // 将sec数组中剩余的元素追加到temp
  while (j <= sec.length - 1) {
    temp[t++] = sec[j++]
  }


  return temp
}

前面的实现,并未能去除重复的元素,增加题目的要求。

合并后的数组,如果包含相同元素,则只保留一个。

function mergeArray(first, sec) {
  var temp = []
  var t = 0


  var i = 0
  var j = 0
  var k
  // 取较短的数组开始loop
  var mid = (first.length <= sec.length) ? first.length - 1 : sec.length - 1
  while (i <= mid && j <= mid) {
    //关键的逻辑在于这行
    k = (first[i] < sec[j]) ? first[i++] : sec[j++]
    //过滤重复元素
    if (t > 0 && k == temp[t - 1]) continue
    temp[t++] = k
  }


  // 将first数组中剩余的元素追加到temp
  while (i <= first.length - 1) {
    k = first[i++]
    if (t > 0 && k == temp[t - 1]) continue
    temp[t++] = k
  }
  // 将sec数组中剩余的元素追加到temp
  while (j <= sec.length - 1) {
    k = sec[j++]
    if (t > 0 && k == temp[t - 1]) continue
    temp[t++] = k
  }


  return temp
}

以上的数组合并只是两个数组,继续引申出,多个有序数组进行合并,并去重排序。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值