JS 【详解】双指针排序 -- 数组合并后递增排序

简介: JS 【详解】双指针排序 -- 数组合并后递增排序

时间复杂度为 O(m + n) ,可简称为 O(n)

排序流程

  1. 在两个数组中,从第一项开始,各自设一个指针
  2. 将两指针对应的元素进行比较,将较小的放入最终数组中,若两元素相同,就都放入最终数组中,若有一个指针没有数据,则将有数据的指针放入最终数组中
  3. 比较完成后,移除元素的数组的指针右移,直至两个指针都不再有元素。

代码实现

function twoPointerSort(arr1, arr2) {
  const result = [];
  let i = 0;
  let j = 0;

  // 只要 arr1 或 arr2 还有值,就继续循环
  while (arr1[i] != null || arr2[j] != null) {
    const v1 = arr1[i];
    const v2 = arr2[j];

    // arr1 和 arr2 都没有值了,则停止
    if (v1 == null && v2 == null) {
      break;
    }
    if (v1 < v2 || v2 == null) {
      // v1 较小,则只拼接 v1
      result.push(v1);
      i++;
    }
    if (v1 > v2 || v1 == null) {
      // v2 较小,则只拼接 v2
      result.push(v2);
      j++;
    }
    if (v1 === v2) {
      // v1 v2 相等,则都拼接
      result.push(v1);
      i++;
      result.push(v2);
      j++;
    }
  }

  return result;
}

测试效果

const arr1 = [1, 3, 5, 7, 9];
const arr2 = [2, 4, 6, 8];

const finalArray = twoPointerSort(arr1, arr2);

console.log(finalArray);

结果

[ 1, 2, 3, 4, 5, 6, 7, 8, 9]

为什么不用 concat + sort 实现 ?

因为时间复杂度高,至少是 O(n*logn)

const res = arr1.concat(arr2).sort((a, b) => a - b)
console.log(res)


目录
相关文章
|
4月前
|
JavaScript 前端开发 算法
JavaScript 中通过Array.sort() 实现多字段排序、排序稳定性、随机排序洗牌算法、优化排序性能,JS中排序算法的使用详解(附实际应用代码)
Array.sort() 是一个功能强大的方法,通过自定义的比较函数,可以处理各种复杂的排序逻辑。无论是简单的数字排序,还是多字段、嵌套对象、分组排序等高级应用,Array.sort() 都能胜任。同时,通过性能优化技巧(如映射排序)和结合其他数组方法(如 reduce),Array.sort() 可以用来实现高效的数据处理逻辑。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
4月前
|
JavaScript 算法 前端开发
JS数组操作方法全景图,全网最全构建完整知识网络!js数组操作方法全集(实现筛选转换、随机排序洗牌算法、复杂数据处理统计等情景详解,附大量源码和易错点解析)
这些方法提供了对数组的全面操作,包括搜索、遍历、转换和聚合等。通过分为原地操作方法、非原地操作方法和其他方法便于您理解和记忆,并熟悉他们各自的使用方法与使用范围。详细的案例与进阶使用,方便您理解数组操作的底层原理。链式调用的几个案例,让您玩转数组操作。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
4月前
|
JavaScript 前端开发 API
JavaScript中通过array.map()实现数据转换、创建派生数组、异步数据流处理、复杂API请求、DOM操作、搜索和过滤等,array.map()的使用详解(附实际应用代码)
array.map()可以用来数据转换、创建派生数组、应用函数、链式调用、异步数据流处理、复杂API请求梳理、提供DOM操作、用来搜索和过滤等,比for好用太多了,主要是写法简单,并且非常直观,并且能提升代码的可读性,也就提升了Long Term代码的可维护性。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
4月前
|
数据采集 JavaScript 前端开发
JavaScript中通过array.filter()实现数组的数据筛选、数据清洗和链式调用,JS中数组过滤器的使用详解(附实际应用代码)
用array.filter()来实现数据筛选、数据清洗和链式调用,相对于for循环更加清晰,语义化强,能显著提升代码的可读性和可维护性。博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
9月前
|
前端开发 JavaScript 算法
使用 JavaScript 数组方法实现排序与去重
【10月更文挑战第21天】通过灵活运用 `sort()` 方法和 `filter()` 方法,我们可以方便地实现数组的排序和去重。同时,深入理解排序和去重的原理,以及根据实际需求进行适当的优化,能够更好地应对不同的情况。可以通过实际的项目实践来进一步掌握这些技巧,并探索更多的应用可能性。
204 59
|
9月前
|
自然语言处理 前端开发 JavaScript
🛠️ JavaScript数组操作指南:20个精通必备技巧🚀
本文详细介绍了 JavaScript 中的 20 个高效数组操作技巧,涵盖了从基本的添加、移除元素,到数组转换和去重等高级操作。强调了不可变性的重要性,提供了清晰的代码示例,帮助开发者编写更整洁和高效的代码。无论是新手还是经验丰富的开发者,这些技巧都将显著提升您的编码能力,使您在项目中更具竞争力。
98 2
|
9月前
|
JavaScript 前端开发 测试技术
JS都有哪些操作数组的方法
JS都有哪些操作数组的方法
119 3
|
9月前
|
JavaScript
js删除数组中已知下标的元素
js删除数组中已知下标的元素
109 4
|
9月前
|
JavaScript 前端开发 Java
【javaScript数组,函数】的基础知识点
【javaScript数组,函数】的基础知识点
82 5
|
9月前
|
缓存 JavaScript 前端开发
JavaScript中数组、对象等循环遍历的常用方法介绍(二)
JavaScript中数组、对象等循环遍历的常用方法介绍(二)
127 1

热门文章

最新文章