分治算法——合并排序与自然排序

合并排序算法:

public class MergeSort {
    public static void MergeSort(int A[],int low,int high){
        if(low<high){
            int middle=(low+high)/2;
            MergeSort(A,low,middle);
            MergeSort(A,middle+1,high);
            Merge(A,low,middle,high);
        }
    }
    public static void Merge(int A[],int low,int middle,int high){
        int B[]=new int[high-low+1];
        int k=0;
        int i=low,j=middle+1;
        while(i<=middle&&j<=high)
            B[k++]=A[i]<A[j]?A[i++]:A[j++];
        while(i<=middle)
            B[k++]=A[i++];
        while(j<=high)
            B[k++]=A[j++];
        i=low;
        k=0;
        while(i<=high)
        A[i++]=B[k++];
    }
}
View Code

自然排序算法:

public class MergeSortUpgrade {
    public static void MergeSortUpgrade(int A[]){
        int s=1;
        while(s<A.length){
            MergePass(A,s);
            s+=s;
        }
    }
    public static void MergePass(int A[],int s){
        int n=A.length;
        int i;
        for( i=0;i<=n-2*s;i=i+2*s)
            Merge(A,i,i+s-1,i+2*s-1);
        if(i+s<n)Merge(A,i,i+s-1,n-1);
    }
    public static void Merge(int A[],int first,int middle,int end){
        int B[]=new int[end-first+1];
        int i=first,j=middle+1,k=0;
        while(i<=middle&&j<=end)
            B[k++]=A[i]<A[j]?A[i++]:A[j++];
        while(i<=middle)
            B[k++]=A[i++];
        while(j<=end)
            B[k++]=A[j++];
        i=first;k=0;
        while(i<=end)
            A[i++]=B[k++];
    }
}
View Code

合并排序:先分在合并。

自然排序:合并长度为s的子数组段,s初始为1,接下来s+=s。

转载于:https://www.cnblogs.com/nihai/p/6682842.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值