美文网首页
归并排序

归并排序

作者: Green_Apple | 来源:发表于2017-07-27 16:32 被阅读0次

    public class MergeSort {

    public static void main(String[] args) {
        int[] a={1,3,5,6,7};
        int[] b={2,4,8,9,10};
        getResult(a,b);
    }
    
    //合并两个有序数组
    public static int[] mergeArray(int[] a,int[] b){
        int a_length=a.length;
        int b_length=b.length;
        int[] c=new int[a_length+b_length];
        int i=0,j=0,k=0; //i 为a数组的元素下标,j为b数组,k为新数组
        while(i<a_length&&j<b_length){
            if(a[i]<b[j])
                c[k++]=a[i++];
            else
                c[k++]=b[j++];
        }
        
        //哪个数组还有元素未添加,则添加进c数组即可
        while(i<a_length) c[k++]=a[i++];  
        while(j<b_length) c[k++]=b[j++];
        
        return c;
    }
    
    
    //非有序数组,先拆分到只剩下一个元素  再进行有序合并
    public static int[] mergeSort(int[] a,int start,int end){
        if(start<end){
            int mid=(start+end)/2;  //分区
            int left[]=mergeSort(a,start,mid);
            int right[]=mergeSort(a,mid+1,end);
            return mergeArray(left,right);
        }else{//当只有一个元素时,直接返回
            int left[]=new int[1];
            left[0]=a[start];
            return left;
        }
    }
    
    public static void getResult(int[] a,int[] b){
        int[] left=mergeSort(a,0,a.length-1);   //第一个数组通过递归分区排序
        int[] right=mergeSort(b,0,b.length-1);//递归分区排序 再合区
        int[] result=mergeArray(a,b); // 采用有序数组归并
        for(int i=0;i<result.length;i++)
            System.out.println(result[i]);
        
    }
    

    }

    相关文章

      网友评论

          本文标题:归并排序

          本文链接:https://www.haomeiwen.com/subject/zjozkxtx.html