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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了分治算法——合并排序与自然排序相关的知识,希望对你有一定的参考价值。

合并排序算法:

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

以上是关于分治算法——合并排序与自然排序的主要内容,如果未能解决你的问题,请参考以下文章

Python 归并排序(递归非递归自然合并排序)

分治算法的完美使用----归并排序

数据结构与算法之排序算法:归并排序

排序算法——归并排序与递归

算法与数据结构:时间复杂度——以归并排序为例

15-看图理解数据结构与算法系列(合并排序)