现在的位置: 首页 > 综合 > 正文

非递归合并排序

2013年12月19日 ⁄ 综合 ⁄ 共 1788字 ⁄ 字号 评论关闭

代码:

package com.zhang1;

public class Test {  

    static void MergeSort(int A[],int n){  

        int[] B = new int[n];//先分配一个长度跟A一样大的数组B   

        int s = 1;//子序列长度,初始为1   

        while(s<n){  

            MergePass(A,B,s,n);//从A[]归并到B[]   

            s+=s;//子序列长度加倍   

            MergePass(B,A,s,n);//从B[]归并到A[]   

            s+=s;//子序列长度加倍   

        }  

    }  

    static void MergePass(int A[],int B[],int s,int n){  

        int i = 0;  

        while(i<=n-2*s){//两两归并   

            Merge(A,B,i,i+s-1,i+2*s-1);  

            i = i+2*s;  

        }  

        if(i+s<n){//归并最后两个序列   

            Merge(A,B,i,i+s-1,n-1);  

        }  

        else{//若最后只剩下单个序列   

            for(int j=i;j<=n-1;j++){  

                B[j] = A[j];  

            }  

        }  

    }  

    static void Merge(int A[],int B[],int low,int mid,int high){  

        int i = low;  

        int j = mid+1;  

        int k = low;  

        while((i<=mid)&&(j<=high)){  

            if(A[i]<=A[j]){  

                B[k++] = A[i++];  

            }  

            else{  

                B[k++] = A[j++];  

            }  

        }  

        while(i<=mid){  

            B[k++] = A[i++];  

        }  

        while(j<=high){  

            B[k++] = A[j++];  

        }  

    }  

    public static void main(String[] args) {  

        int A[] = {78,102,90,8,7,6,5,40,3,11,1};  

        System.out.println("排序前,数组为:");  

        for(int i=0;i<A.length;i++){  

            System.out.print(A[i]+" ");  

        }  

        System.out.println();  

        MergeSort(A,A.length);  

        System.out.println("排序后,数组为:");  

        for(int i=0;i<A.length;i++){  

            System.out.print(A[i]+" ");  

        }         

    }  

}  

运行结果:

排序前,数组为:

78 102 90 8 7 6 5 40 3 11 1 

排序后,数组为:

1 3 5 6 7 8 11 40 78 90 102 

注意点:

A,在MergePass和Merge中循环的边界很难确定,只有通过列举每次S取值时,i的值来推出其边界

抱歉!评论已关闭.