向Array中添加归并排序

本文详细介绍了归并排序的基本思想及其实现步骤。首先通过比较两个有序数组中的元素,将其合并成一个更大的有序数组。然后利用自底向上的方式,逐步增加待排序数组的长度,直至整个数组有序。

归并排序思路

1) 归并

从两个有序表R[low...mid]和R[mid+1...high],每次从左边依次取出一个数进行比较,将较小者放入tmp数组中,最后将两段中剩下的部分直接复制到tmp中。

这样tmp是一个有序表,再将它复制加R中。(其中要考虑最后一个子表的长度不足length的情况)

2) 排序

自底向上的归并,第一回:length=1;第二回:length=2*length ...

 

代码实现

Function.prototype.method = function(name, func){
    this.prototype[name] = func;
    return this;
};

Array.method('merge', function(low, mid, high){
    var tmp = new Array(), i = low, j=mid+1, k=0;
    while(i<=mid && j<=high){
        if(this[i] <= this[j]){//比较第一部分和第二部分,取较小者
            tmp[k] = this[i];
            i++;
            k++;
        }else{
            tmp[k] = this[j];
            j++;
            k++;
        }
    }
    while(i<=mid){
        tmp[k] = this[i];
        i++;
        k++;
    }
    while(j<=high){
        tmp[k] = this[j];
        j++;
        k++;
    }
    for(k=0,i=low; i<=high; k++,i++) this[i] = tmp[k];

    return this;
});
Array.method('mergePass', function(length, n){
    var i;
    for(i=0; i+2*length-1<n; i=i+2*length) this.merge(i, i+length-1, i+2*length-1);
    if(i+length-1 < n) this.merge(i, i+length-1, n-1); //考虑到最后一个子表的长度可能小于length,所以要特殊处理一下

    return this;
});

Array.method('mergeSort', function(){
    var len = this.length,
        length;
    for(length=1; length<len; length=2*length) this.mergePass(length, len);

    return this;
});

转载于:https://www.cnblogs.com/JChen666/p/3360344.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值