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

相关文章
相关标签/搜索