数据结构与算法:两个有序数组变成一个有序数组不使用sort

下面为两个有序数组变成一个有序数组(不使用sort) codes

写法一(若一看不太明白,可以下翻看二)

// 思路:从后向前依次循环数组的总长度,如果fakeSSR的最后一位 < fakeSSE的最后一位 
// 就再新数组中添加fakeSSE最后一位 并且 fakeSSE的长度-1拿到最新的最后一位数据继续比较 
// 反之 添加fakeSSR最后一位 并且 fakeSSR的长度-1拿到最新的最后一位数据继续比较 
// 不理解的可以直接复制到vscode里断点调试看一下就明白了
let fakeSSR = [1,3,5,6,7,13,14,15,16,23,43]
let fakeSSE = [3,4,6,9,13,17,19,20,21]
function solution (num1, num2) {
  // 数组1的长度
  let m = num1.length;
  // 数组2的长度
  let n = num2.length;
  // 数组1的最后一位的下表
  let p1 = m - 1;
  // 数组2的最后一位的下表
  let p2 = n - 1;
  // 新数组的最后一位的下表
  let p = m + n - 1;
  // 循环遍历 递减 
  // 当数组1 和 数组2的长度都大于0则循环
  // 如果需要覆盖fakeSSR数组则条件更改为
  // p1 >= 0 && p2 >= 0
  // 如果需要赋值到新数组则条件为
  // p1 >= 0 && p2 >= n-m
  while (p1 >= 0 && p2 >= 0) {
    // 数组1的最后一位 = 
    // 数组1的最后一位 < 数组2的最后一位就
    // 如果需要覆盖fakeSSR数组则赋值对象变更为
    // fakeSSr[p--] = (num1[p1] < num2[p2] ? num2[p2--] : num1[p1--])
    fakeSSR[p--] = (num1[p1] < num2[p2] ? num2[p2--] : num1[p1--])
  } 
  return fakeSSR 
}
console.log(solution(fakeSSR,fakeSSE));
/**
[
   1,  3,  3,  4,  5,  6,  6,
   7,  9, 13, 13, 14, 15, 16,
  17, 19, 20, 21, 23, 43
]
*/

thank u for coming~

写法二

let ad = [1,3,5,6,7,13,14,15,16,20,33]
let ap = [3,4,6,8,9,13,17,18,19]
// 合并后的数组有序
let between = []
const transForNew = (ad,ap) => {
  // 直接循环次数为两个数组的总长度
  while(ad.length + ap.length > 0){
  // 如果 其中有一个数组里的数字被添加到新数组添加完了 就是 length < 1
    if(ad.length < 1 || ap.length < 1){
      // 则把剩余的那个数组合并到between中  
      between = between.concat(ad.length < 1 ? ap : ad)
      break
    }
    // 没有空数组则判断
    // 分别拿出两个数组中的第一位作比较
    // for example ad的第一个数 比 ap的第一个数大 则把ap的这个小数添加到新数组between中
    // 然后把这个小数在原数组中删除,再拿ad的这个大的数字和ap的下一个作比较
    // 依此类推 反之亦是如此
    between.push(ad[0] >= ap[0] ? ap.shift() : ad.shift())
  }
  return between
} 
console.log(transForNew(ad,ap));
/**
[
   1,  3,  3,  4,  5,  6,  6,
   7,  8,  9, 13, 13, 14, 15,
  16, 17, 18, 19, 20, 33
]
*/

thank u for coming~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值