摘要:假設(shè)有這樣一個需求,一個數(shù)組的子元素全是有序數(shù)組,類似我們希望將上述數(shù)組合并為一個有序數(shù)組,怎么處理呢最簡單的方案就是將數(shù)組整體合并,然后排序,代碼如下但是上面的代碼沒有充分利用數(shù)組子元素本身就是有序數(shù)組這一特性,我們利用歸并排序算
假設(shè)有這樣一個需求,一個數(shù)組的子元素全是有序數(shù)組,類似:
let arr= [[1, 2], [0, 3, 4,4,4,6,7,8,9,10], [-1, 4],[-1,3],[-1],[100,200],[5,1000,30000]];
我們希望將上述數(shù)組合并為一個有序數(shù)組,怎么處理呢?
最簡單的方案就是:
將數(shù)組整體合并,然后sort排序,代碼如下:
let ret=arr.reduce((arr1,arr2)=>arr1.concat(arr2)).sort((a,b)=>a-b); ret=Array.from(new Set(ret)); console.log(ret);
但是上面的代碼沒有充分利用數(shù)組子元素本身就是有序數(shù)組這一特性,我們利用“歸并排序”算法,可以大大的提高類似數(shù)組的合并排序性能,代碼(代碼里面有詳細注釋)如下:
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){ //記錄每一個數(shù)組循環(huán)比較時的下標(biāo)變化 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){ //循環(huán)比較每個數(shù)組的第一個元素 compareArr=indexArr.map((item,index)=>{ return { index:item.index, val:arr[item.index][item.count] } }); pushToArr(compareArr); } //取出最后不需要比較的數(shù)組元素,直接拼接到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);
由于子數(shù)組本身有序,分別記錄要被比較數(shù)組的下標(biāo),循環(huán)取出最小值push到ret就可以了,是不是很簡單。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/84220.html
摘要:本文對一些排序算法進行了簡單分析,并給出了的代碼實現(xiàn)。平均時間復(fù)雜度不好分析,它是冒泡排序是穩(wěn)定的排序算法。冒泡排序是原地排序算法原地排序指的是空間復(fù)雜度是的排序算法。歸并排序,會將數(shù)組從中間分成左右兩部分。 本文對一些排序算法進行了簡單分析,并給出了 javascript 的代碼實現(xiàn)。因為本文包含了大量的排序算法,所以分析不會非常詳細,適合有對排序算法有一定了解的同學(xué)。本文內(nèi)容其實不...
摘要:適用于數(shù)據(jù)比較少或基本有序的情況。插入排序時間復(fù)雜度為,空間復(fù)雜度為,屬于穩(wěn)定排序。算法適用于少量數(shù)據(jù)的排序。就像下圖這樣,可以理解桶的意思下圖是整個排序過程示意圖基數(shù)排序時間復(fù)雜度為,空間復(fù)雜度為,屬于穩(wěn)定排序。 寫在前面 個人感覺:javascript對類似排序查找這樣的功能已經(jīng)有了很好的封裝,以致于當(dāng)我們想對數(shù)組排序的時候只需要調(diào)用arr.sort()方法,而查找數(shù)組元素也只需要...
摘要:下面會介紹的一種排序算法快速排序甚至被譽為世紀科學(xué)和工程領(lǐng)域的十大算法之一。我們將討論比較排序算法的理論基礎(chǔ)并中借若干排序算法和優(yōu)先隊列的應(yīng)用。為了展示初級排序算法性質(zhì)的價值,我們來看一下基于插入排序的快速的排序算法希爾排序。 前言 排序就是將一組對象按照某種邏輯順序重新排列的過程。比如信用卡賬單中的交易是按照日期排序的——這種排序很可能使用了某種排序算法。在計算時代早期,大家普遍...
馬上就要開始啦這次共組織15個組隊學(xué)習(xí) 涵蓋了AI領(lǐng)域從理論知識到動手實踐的內(nèi)容 按照下面給出的最完備學(xué)習(xí)路線分類 難度系數(shù)分為低、中、高三檔 可以按照需要參加 - 學(xué)習(xí)路線 - showImg(https://segmentfault.com/img/remote/1460000019082128); showImg(https://segmentfault.com/img/remote/...
閱讀 1459·2021-11-22 13:52
閱讀 1281·2021-09-29 09:34
閱讀 2690·2021-09-09 11:40
閱讀 3031·2019-08-30 15:54
閱讀 1255·2019-08-30 15:53
閱讀 971·2019-08-30 11:01
閱讀 1354·2019-08-29 17:22
閱讀 1943·2019-08-26 10:57