资讯专栏INFORMATION COLUMN

javascript实现将多个有序数组合并为一个有序数组的算法

hiYoHoo / 994人阅读

摘要:假设有这样一个需求,一个数组的子元素全是有序数组,类似我们希望将上述数组合并为一个有序数组,怎么处理呢最简单的方案就是将数组整体合并,然后排序,代码如下但是上面的代码没有充分利用数组子元素本身就是有序数组这一特性,我们利用归并排序算

假设有这样一个需求,一个数组的子元素全是有序数组,类似:

let arr= [[1, 2], [0, 3, 4,4,4,6,7,8,9,10], [-1, 4],[-1,3],[-1],[100,200],[5,1000,30000]];

我们希望将上述数组合并为一个有序数组,怎么处理呢?

最简单的方案就是:
将数组整体合并,然后sort排序,代码如下:

let ret=arr.reduce((arr1,arr2)=>arr1.concat(arr2)).sort((a,b)=>a-b);
ret=Array.from(new Set(ret));
console.log(ret);

但是上面的代码没有充分利用数组子元素本身就是有序数组这一特性,我们利用“归并排序”算法,可以大大的提高类似数组的合并排序性能,代码(代码里面有详细注释)如下:

let arr= [[1, 2], [0, 3, 4,4,4,6,7,8,9,10], [-1, 4],[-1,3],[-1],[100,200],[5,1000,30000]];
// let arr= [[1,2,3]];

function merge(arr){

    //记录每一个数组循环比较时的下标变化
    function filterIndexArr() {
        indexArr=indexArr.filter((item,index)=>{
            return item.count{
            if (minVal>item.val){
                minVal=item.val;
                increaseArr=[item.index];
            }else if (minVal==item.val && index!=0){
                increaseArr.push(item.index)
            }
        });
        increaseArr.forEach((item)=>{
            let thatItem=item;
            indexArr.forEach((item)=>{
                if (item.index==thatItem){
                    item.count++;
                }
            });
        });
        filterIndexArr();
        ret.push(minVal);
    }

    let ret=[];
    let indexArr=arr.map((item,index)=>{
        return {
            index,
            count:0
        }
    });
    filterIndexArr();

    let compareArr=[];
    while (indexArr.length>1){
        //循环比较每个数组的第一个元素
        compareArr=indexArr.map((item,index)=>{
            return {
                index:item.index,
                val:arr[item.index][item.count]
            }
        });
        pushToArr(compareArr);
    }
    //取出最后不需要比较的数组元素,直接拼接到ret后面
    let remainArr=arr[indexArr[0].index].slice(indexArr[0].count);
    ret=ret.concat(remainArr);
    ret=Array.from(new Set(ret));
    return ret;
}

let ret=merge(arr);
console.log(ret);

由于子数组本身有序,分别记录要被比较数组的下标,循环取出最小值push到ret就可以了,是不是很简单。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/84220.html

相关文章

  • 排序算法分析总结(附js实现

    摘要:本文对一些排序算法进行了简单分析,并给出了的代码实现。平均时间复杂度不好分析,它是冒泡排序是稳定的排序算法。冒泡排序是原地排序算法原地排序指的是空间复杂度是的排序算法。归并排序,会将数组从中间分成左右两部分。 本文对一些排序算法进行了简单分析,并给出了 javascript 的代码实现。因为本文包含了大量的排序算法,所以分析不会非常详细,适合有对排序算法有一定了解的同学。本文内容其实不...

    liaoyg8023 评论0 收藏0
  • 基于 Javascript 排序算法

    摘要:适用于数据比较少或基本有序的情况。插入排序时间复杂度为,空间复杂度为,属于稳定排序。算法适用于少量数据的排序。就像下图这样,可以理解桶的意思下图是整个排序过程示意图基数排序时间复杂度为,空间复杂度为,属于稳定排序。 写在前面 个人感觉:javascript对类似排序查找这样的功能已经有了很好的封装,以致于当我们想对数组排序的时候只需要调用arr.sort()方法,而查找数组元素也只需要...

    tommego 评论0 收藏0
  • 归并排序就这么简单

    摘要:归并排序就这么简单从前面已经讲解了冒泡排序选择排序插入排序快速排序了,本章主要讲解的是归并排序,希望大家看完能够理解并手写出归并排序快速排序的代码,然后就通过面试了如果我写得有错误的地方也请大家在评论下指出。 归并排序就这么简单 从前面已经讲解了冒泡排序、选择排序、插入排序,快速排序了,本章主要讲解的是归并排序,希望大家看完能够理解并手写出归并排序快速排序的代码,然后就通过面试了!如果...

    ingood 评论0 收藏0
  • 排序算法(Java)——那些年面试常见排序算法

    摘要:下面会介绍的一种排序算法快速排序甚至被誉为世纪科学和工程领域的十大算法之一。我们将讨论比较排序算法的理论基础并中借若干排序算法和优先队列的应用。为了展示初级排序算法性质的价值,我们来看一下基于插入排序的快速的排序算法希尔排序。 前言   排序就是将一组对象按照某种逻辑顺序重新排列的过程。比如信用卡账单中的交易是按照日期排序的——这种排序很可能使用了某种排序算法。在计算时代早期,大家普遍...

    Harpsichord1207 评论0 收藏0
  • 第7期 Datawhale 组队学习计划

    马上就要开始啦这次共组织15个组队学习 涵盖了AI领域从理论知识到动手实践的内容 按照下面给出的最完备学习路线分类 难度系数分为低、中、高三档 可以按照需要参加 - 学习路线 - showImg(https://segmentfault.com/img/remote/1460000019082128); showImg(https://segmentfault.com/img/remote/...

    dinfer 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<