Javascript合併算法的實現(遞歸&迭代)

使用分治法將須要排序的內容一分爲二,二分爲四,四分爲八……數組

將內容分解到經過最後單獨比較大小的粒度,進行排序,而後將內容八併爲四,四併爲二,二併爲一。bash


一、遞歸實現:函數

function merge(left,right){
    var result = [];
    while(left.length>0&&right.length>0){
        if(left[0]<right[0]){
            result.push(left.shift());
        }else{
            result.push(right.shift());
        }
    }
    return result.concat(left).concat(right);
}

function mergeSort(items){
    if(items.length==1){
        return items;
    }
    var half = Math.floor(items.length/2),
        left = items.slice(0,half),
        right = items.slice(half);
    return merge(mergeSort(left),mergeSort(right));
}
複製代碼

邏輯比較簡單,一個是merge函數,用來排序內容。mergeSort函數用來將內容劃分到最小粒度。缺點是當內容長度到達必定限度後,會發生棧溢出錯誤。ui


二、迭代實現:spa

function mergeSort(items){
    var len = items.length;
    if(len==1){
        return items;
    }
    var result = [];
    for(var i=0;i<len;i++){
        result.push([items[i]]);
    }
    if(len%2){
        result.push([]);
    }
    var lim = len/2;
    while(lim>=1){
        for(var j=0,k=0;j<lim;j++,k=k+2){
            result[j] = merge(result[k],result[k+1]);
        }
        lim = lim/2;
    }
    return result[0];
}
複製代碼

實現邏輯和遞歸調用不一樣,迭代的實現方式,是經過操做某一個數組,合併該數組實現的。不會存在棧溢出問題,可是效率會低於遞歸。code

相關文章
相關標籤/搜索