merge sort(归并排序)

merge sort(归并排序) 是一种采用分治策略的排序方法。最坏时间复杂度为 O(nlgn)

 

要分析算法运行的时间复杂度,关键的就是要列出分治过程中的递归式:



然后,复杂度的估算可以使用递归树方法,也可以直接使用主定理来证明。详情请参考《算法导论》


我实现的C++ 版本代码如下所示:


/*  MAXN为A的长度上限 
    inf 是一个大整数  
    数组计数从0开始  
*/

void merge(int A[],int p,int m,int q) {
    int i,j,k;
    int L[MAXN+1], R[MAXN+1];

    i = j = 0;
    for(k = p ; k <= m ; k ++)
    {
        L[i++] = A[k];
    }
    for(k = m+1 ; k <= q ; k ++)
    {
        R[j++] = A[k];
    }
    L[i] = R[j] = inf;

    i = j = 0;
    for(k = p ; k <= q ; k ++)
    {
        if(L[i] < R[j]) {
            A[k] = L[i++];
        }
        else {
            A[k] = R[j++];
        }
    }
}

void merge_sort(int A[] , int p,int q) {
    if(q > p) {
        int m=(p+q)/2;
        merge_sort(A,p,m);
        merge_sort(A,m+1,q);
        merge(A,p,m,q);
    }
}


References:


[1] Thomas H.Cormen Charles E. Leiserson Ronald L.Rivest Clifford Stein 《Introduction to Algorithms Second Edition》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值