合并已排序的數(shù)組

條件:
兩個(gè)數(shù)組分別已經(jīng)升序排列。
要求:
合并兩個(gè)數(shù)組并返回新的已經(jīng)排序后的數(shù)組。
分析該題目,其要求與歸并排序的實(shí)現(xiàn)思想相同。
歸并排序的算法中,使用“分治”策略,而這道題的實(shí)現(xiàn)邏輯,僅需要用到歸并算法中的“治”。
function mergeArray(first, sec) {var temp = new Array(first.length + sec.length)var t = 0var i = 0var j = 0// 取較短的數(shù)組作為loop條件var mid = (first.length <= sec.length) ? first.length - 1 : sec.length - 1while (i <= mid && j <= mid) {//關(guān)鍵的邏輯在于這行temp[t++] = (first[i] < sec[j]) ? first[i++] : sec[j++]}// 將first數(shù)組中剩余的元素追加到tempwhile (i <= first.length - 1) {temp[t++] = first[i++]}// 將sec數(shù)組中剩余的元素追加到tempwhile (j <= sec.length - 1) {temp[t++] = sec[j++]}return temp}
前面的實(shí)現(xiàn),并未能去除重復(fù)的元素,增加題目的要求。
合并后的數(shù)組,如果包含相同元素,則只保留一個(gè)。
function mergeArray(first, sec) {var temp = []var t = 0var i = 0var j = 0var k// 取較短的數(shù)組開始loopvar mid = (first.length <= sec.length) ? first.length - 1 : sec.length - 1while (i <= mid && j <= mid) {//關(guān)鍵的邏輯在于這行k = (first[i] < sec[j]) ? first[i++] : sec[j++]//過濾重復(fù)元素if (t > 0 && k == temp[t - 1]) continuetemp[t++] = k}// 將first數(shù)組中剩余的元素追加到tempwhile (i <= first.length - 1) {k = first[i++]if (t > 0 && k == temp[t - 1]) continuetemp[t++] = k}// 將sec數(shù)組中剩余的元素追加到tempwhile (j <= sec.length - 1) {k = sec[j++]if (t > 0 && k == temp[t - 1]) continuetemp[t++] = k}return temp}
以上的數(shù)組合并只是兩個(gè)數(shù)組,繼續(xù)引申出,多個(gè)有序數(shù)組進(jìn)行合并,并去重排序。
評論
圖片
表情
