归并排序

在js中,采用的是自上而下的归并排序。
原理:
注:我们将每次经行合并排序的两个数组看成左右数组。左数组中的内容在原始数组中则在右数组的左侧。
第一步:将数组分割为数个一个内容为一组的数组。//这一步并不是我们所想的那样一下子把原始数组分割成功,而是通过step(步长)来
获取原始数组中的每一项。
第二步:先两两为一组进行合并排序,然后四个四个为一组进行合并排序,依次类推,如果有成单元素则放到最后与前面合并排序好的数
组进行合并排序。
实际在整个代码中并没有体现出第一步,而是直接进行的第一步,因为我们可以控制步长来获得相对应数量的内容。
若想更好理解,需按照算法动笔画一画每一次排序的过程,方能掌握。具体算法和注释如下
/*归并排序 在js中是自底而上的,不是自顶而下*/
function mergeSort(arr){
    var len = arr.length;
    if(len < 2){
        return;
    }
    var left,right,step = 1;//初始化步长step为1
    while(step < len){
        left = 0;
        right = step;
        while(right + step <= len){
            var count = right + step;//表示我们一共传过去多少内容
            mergeArrays(arr,left,right,count,step);//进行合并排序
            left = right + step;
            right = left + step;
        }
        if(right < len){//若数组有成单内容,则最后与前面合并排序好的数组经行合并排序
            mergeArrays(arr,left,right,len,step);
        }
        step *= 2;//步长乘2
    }
}
function mergeArrays(arr,startLeft,startRight,count,step){
    var leftArr = new Array(step);//设置左数组
    var rightArr = new Array(step);//设置右数组
    //注:我们将每次经行合并排序的两个数组看成左右数组。
    var indexLeft = startLeft;//初始化左数组初始下标
    for(var i = 0;i < step;i++){//拿到左数组对应的内容
        leftArr[i] = arr[indexLeft];
        indexLeft++;
    }
    var rightIndex = startRight;//初始化右数组初始下标
    for(var j = 0;j < step;j++){//拿到左数组对应的内容
        rightArr[j] = arr[rightIndex];
        rightIndex++;
    }
    //设置边界值
    leftArr[leftArr.length] = Infinity;
    rightArr[rightArr.length] = Infinity;
    //设置leftArr和rightArr下标
    var left = right = 0;
    //通过比较左右数组中的内容对原始数组进行排序,用的是直接赋值
    for(var index = startLeft;index < count;index++){
        if(leftArr[left] <= rightArr[right]){
            arr[index] = leftArr[left];
            left++;
        }else{
            arr[index] = rightArr[right];
            right++;
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值