归并排序

归并排序是可以被实际使用的排序算法,其复杂度为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;
}

主要流程:

  算法首先将原始数组分割直至只有一个元素的子数组,然后开始归并。归并过程也会完成排序,直至原始数组完全合并并完成排序。

图示: