js排序算法04——归并排序

本文介绍了一种稳定的排序算法——归并排序。通过分治法将数组拆分成更小的子数组,直至每个子数组仅包含一个元素,再逐步合并这些子数组以形成最终的有序数组。文章还提供了JavaScript实现代码,并分析了归并排序的时间和空间复杂度。

归并排序是一种分治算法。思想是把原数组切分成较小的数组,直到每个小数组只有一个位置,再将小数组归并成较大的数组,直到最后有一个完整有序的大数组。

js实现如下:

function mergeSort(arr){
    if(arr.length==1){
        return arr;       //长度为1直接返回
    }
    else if(arr.length==2){
        var ar0=arr[0];
        var ar1=arr[1];
            arr[0]=ar0<=ar1?ar0:ar1;
            arr[1]=ar0>ar1?ar0:ar1;         //长度为2,返回排好序的数组
    }
    else{
        var mid = Math.floor(arr.length/2);
        var left=mergeSort(arr.slice(0,mid));
        var right=mergeSort(arr.slice(mid,arr.length));    //递归
        var result=[];
        var il=0;
        var ir=0;
        while(il<left.length&&ir<right.length){
            if(left[il]<=right[ir]){
                result.push(left[il++]);
            }
            else{
                result.push(right[ir++]);
            }
        }                       //合并
        while(il<left.length){
            result.push(left[il++]);
        }                       //左边的数组未拍完,直接添加在数组末尾
        while(ir<right.length){
            result.push(right[ir++]);
        }                       //右边的数组未拍完,直接添加在数组末尾
        //以上两个至多有一个会发生
        return result;  
    }
}

归并排序是一种稳定排序,无论最好情况和最坏情况时间复杂度为O(nlogn),空间复杂度为O(n)。

附:T(n)=2T(n/2)+cn;

T(n)=4T(n/4)+2cn;

T(n)=8T(n/8)+3cn;

n=2^k;

k=logn;

T(n)=2^kT(n/2^k)+kcn;

T(n)=nT(1)+cnlog2n;

转载于:https://www.cnblogs.com/renbo/p/8284621.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值