归并排序(Merge Sort)是建立在归并操作上的一种有效,稳定的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。

整个归并排序分成两个阶段,第一个阶段是,将整个数组分成单个元素的子序列,因为只有一个元素的子序列肯定是有序的。
第二个阶段是合并,将分成的每个子序列逐渐合并成一个完整有序的数组。

如图:
归并排序 思想 图示

从图中可以看出,分出的二叉树深度为log2n(如数组总长度为8,则树的深度为3),而合并操作的平均时间复杂度为 O(n),那么归并排序的平局时间复杂度就是 O(nlogn)

代码实现如下:

var mergeSort = function(array){
    return mergeSortRec(array);
}
var mergeSortRec = function(array){
    var length = array.length;
    if (length === 1) {
        return array;
    }
    var mid = Math.floor(length / 2),
        left = array.slice(0, mid),
        right = array.slice(mid, length);
    return merge(mergeSortRec(left), mergeSortRec(right));
}
var merge = function(left, right){
    var result = [],
        il = 0,
        ir = 0;
    while(il < left.length && ir < right.length){
        if(left[il] < right[ir]){
            result.push(left[il++]);
        }else{
            result.push(right[ir++]);
        }
    }
    while(il < left.length){
        result.push(left[il++]);
    }
    while(ir < right.length){
        result.push(right[ir++]);
    }
    return result;
}

var createNonSortedArray = function(size){
    var array = new Array();
    for (var i = size; i > 0; i--) {
        array.push( parseInt(Math.random()*100) );  
    }
    return array;
}

var arr = createNonSortedArray(10);
arr = mergeSort(arr)
console.log(arr)    //[15, 22, 25, 54, 56, 57, 66, 69, 78, 89]


这个少年有点热丶
363 声望12 粉丝

[链接]