js排序算法基礎--歸併排序

歸併排序

歸併排序是能夠被實際使用的排序算法,其複雜度爲O(nlogn)。算法

思路:歸併排序是一種分治算法。其思想是將原始數組切分爲較小的數組,知道每一個小數組只有一個位置。接着將小數組歸併爲較大的數組,直到最後只有一個排序完畢的大數組。數組

因爲是分治法,歸併排序也是遞歸的;咱們首先定義一個實際被執行的輔助函數。函數

// 該函數是將一個數組切分爲兩個數組
function mergeSort(array){
    var length = array.length;
    // 當length爲1時,說明已經切割爲最小數據,遞歸的結束條件
    if(length == 1){
        return array;
    }
    var mid = Math.floor(length / 2),
        left = array.slice(0,mid),
        right = array.slice(mid,length);
   // merge函數,負責將分割的小數組合並
return merge(mergeSort(left), mergeSort(right))
}
function merge(left, right){
    var result = [],
        il = 0,
        ir = 0;
    // 這裏的left 和 right 分被是兩個已經排過序的數組
    // 選擇兩個數組中最小的依次放入結果中,直到一個數組的值徹底放進結果集中
    // 直到其中的一個數組所有放到結果集中,結束循環
    while(il < left.length && ir < right.length){
        if(left[il] < right[ir]){
            result.push(left[il++])
        }else{
            result.push(right[ir++])
        }
    }
    //將尚未徹底放進去的那個數組,依次放入結果集,由於每一個數組必定是已經排好序的
    // 這裏的left 與 right 不分前後 由於到這裏確定有一個數組爲空,
    while(il < left.length){
        result.push(left[il++])
    }
    while(ir < right.length){
        result.push(right[ir++])
    }
    return result;
}

主要流程:spa

  算法首先將原始數組分割直至只有一個元素的子數組,而後開始歸併。歸併過程也會完成排序,直至原始數組徹底合併並完成排序。code

圖示:blog

相關文章
相關標籤/搜索