归并排序 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] 左边元素大于右边元素,放右边元素