Skip to content

Latest commit

 

History

History
74 lines (66 loc) · 1.8 KB

File metadata and controls

74 lines (66 loc) · 1.8 KB
/**
 * 2019/3/15
 * 公众号: 「一个不甘平凡的码农」
 * 功能:归并排序
 * @author 小鹿
 */

/**
* 时间:2019/3/15
* 功能:递归分治
* 算法思想:
* 1 将数据分治
* 2 终止条件
* 3 取中间值
* 4 递归 分解
* 5 合并
* @param arr 要分治的数组
*/
const mergeSort = (arr) => {
    //终止条件
    if(arr.length <= 1) return arr;
    
    //找中间数值(Math.floor() 返回小于或等于一个给定数字的最大整数)
    const middle = Math.floor(arr.length / 2);
    
    //分割数组
    const left = arr.slice(0,middle);
    const right = arr.slice(middle);
    
    //递归 分解 合并
    return mergeArr(mergeSort(left),mergeSort(right))
}

/**
* 时间:2019/3/15
* 功能: 合并函数
* 1)声明两个指针分别指向两个数组的第一个数据
* 2)进行比较,合并两个数组
* 3)将数组剩余数据追加到尾部
* @param left 数组分割的左部分
* @param right 数组分割的右部分
*/
const mergeArr = (left,right) => {
    let temp = [];
    let leftIndex = 0;
    let rightIndex = 0;
    
    //判断两个数组大小,插入新数组进行排序
    while(leftIndex < left.length  && rightIndex < right.length){
        if(left[leftIndex] <= right[rightIndex]){
            temp.push(left[leftIndex]);
            leftIndex++;
        }else{
            temp.push(right[rightIndex]);
            rightIndex++;
        }
    }
    //合并数组多余部分数据
    return temp.concat(left.slice(leftIndex)).concat(right.slice(rightIndex));
}

//随机数据进行排序
const testArr = []
let i = 0
while(i < 100){
    testArr.push(Math.floor(Math.random()*1000));
    i++;
}
//打印数组
const res = mergeSort(testArr);
console.log(res);