归并排序将两个或者以上的有序表组合成一个新的有序表,通过不断的二二归并,最后形成有序的数组
public static int[] mergeSort(int[] a,int low,int high){
int mid = (low+high)/2;
if(low<high){
mergeSort(a,low,mid);
mergeSort(a,mid+1,high);
merge(a,low,mid,high);
}
return a;
}
public static void merge(int[] a, int low, int mid, int high) {
int[] temp = new int[high-low+1];
int i= low;
int j = mid+1;
int k=0;
while(i<=mid && j<=high){
if(a[i]<a[j]){
temp[k++] = a[i++];
}else{
temp[k++] = a[j++];
}
}
while(i<=mid){
temp[k++] = a[i++];
}
while(j<=high){
temp[k++] = a[j++];
}
for(int x=0;x<temp.length;x++){
a[x+low] = temp[x];
}
}
归并的基本流程如下图,本质是将两个有序数组合并成为一个成为一个有序数组,merge方法的变量在图中的具体表示
但是呢,是不是一看就会,一写就废呢?看下面的具体方法执行流程图,其实并没有我们想象的那么简单的执行。
说说合并数组,以merge(a,0,0,1)为例子,这个例子比较特殊,属于比较的边界情况
low:0 mid:0 high:1
这三个while判断,其中第一个是判断是否到达边界,即归并的边界,上述的例子刚刚好在等于的情况,如果再i++或者j++则跳出循环,里面谁的值大则添加到新数组,并++,当有一个数组到达边界就会进行下面的两个循环判断,将没满的元素也添加到信数组中,最后for循环覆盖原数组。