码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2017-04-08 20:53:09      阅读:227      评论:0      收藏:0      [点我收藏+]

标签:color   i++   ++   ade   alt   算法   display   logs   one   

合并排序算法:

技术分享
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。

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

标签:color   i++   ++   ade   alt   算法   display   logs   one   

原文地址:http://www.cnblogs.com/nihai/p/6682842.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!