归并排序

public class MergeSort 
{
    public static void splitArray(int[] a,int start,int end){
        
        if(start<end){
            
            int mid=(start+end)/2;//总是将数据分为两部分,也许不等长
            splitArray(a,start,mid);
            splitArray(a,mid+1,end);
            mergeArray(a,start,mid,end);
        }
    }
    
    //总体来说,合并是一种使用空间换取时间的过程
    public static void mergeArray(int[] a,int start,int middle,int end){
        
        int i,j,k;//定义变量
        int l=middle-start+1,r=end-middle;
        int[] left = new int[l];
        int[] right = new int[r];
        //缓存的数组
        for(i=0,k=start;i<left.length;i++,k++){
            left[i]=a[k];
        }
        for(j=0,k=middle+1;j<right.length;j++,k++){
            right[j]=a[k];
        }
        //数组排序,数组a中的要排序数据已经全部复制,所以可以覆盖擦除部分    
        for(i=0,j=0,k=start;i<left.length&&j<right.length;k++){
            if(left[i]>right[j]){
                a[k]=right[j];
                j++;
            }
            else
            {
                a[k]=left[i];
                i++;
            }
        }

        if(i<left.length){
            for(int m=i;m<left.length;m++){
                a[k++]=left[m];
            }
        }

        if(j<right.length){
            for(int m=j;m<right.length;m++){
                a[k++]=right[m];
            }
        }

    }

    public static void main(String[] args) 
    {
        int[] a = new int[]{9,1,5,8,3,7,4,6,2,12,22,14,16,34,100,17,23,56,140,0,11};
            //{8,5,9,4,6,0,1,7,3,2};
        splitArray(a,0,a.length-1);
        for(int ele:a){
            System.out.print(ele+"  ");
        }
    }
}
 

转载于:https://my.oschina.net/u/2439096/blog/741068

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值