归并排序

归并排序  merge(a,lo,mid,hi);  //将子数组 a[lo...mid]  和 a[mid+1....hi] 归并 ,这里两个子数组是有序的;

代码:

 public static void merge(int[] a, int lo,int mid,int hi) {
		int i=lo;
		int j=mid+1;
		int[] aux=new int[hi-lo+1];
		for(int k=lo;k<=hi;k++) {
			aux[k]=a[k];
		}
		for(int k=lo;k<hi;k++) {
			if      (i>mid)        a[k]=aux[j++];
			else if (j>hi)         a[k]=aux[i++];
			else if (a[i]<a[j])    a[k]=aux[i++];
			else                   a[k]=aux[j++];
		}
}

i  是低指针 ; j 是高指针 

merge方法进行了四个判断: i>mid 左半边元素用尽,一直放右半边元素即可

                                               j>hi 右半边元素用尽,一直放左半边元素即可

                                              a[i]<a[j] 左边元素小于右边元素,放左边元素

                                              a[i]>a[j] 左边元素大于右边元素,放右边元素

自顶向下的归并排序

代码:

public static void sort(int[] a,int lo,int hi){
    if(hi<=lo) return;
    int mid=lo+(lo+hi)/2;
    sort(a,lo,mid);
    sort(a,mid+1,hi);
    merge(a,lo,mid,hi);
}

自底向上的归并排序

public static void sort(int[] a){
   int N=a.length;
   int[] aux=new int[N];
   for(int sz=1;sz<N;sz=zs+sz){
       for(int lo=0;lo<N-sz;lo=lo+2*sz){
           merge(a,lo,lo+sz-1,Math.min(lo+sz+sz-1,N-1);
       }
   }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值