/*--------------------归并排序------------------------*/
@Test
public void mergeSort(){
int[] array = { 5, 2, 4, 6, 1, 3 };
mergeSort(array,0,array.length-1);
System.out.println(Arrays.toString(array));
}
private void mergeSort(int[] array, int i, int j) {
//由于i不断变大,j不断变小,所以这里应该控制i应该小于j
if(i<j){
//先计算中间点位置
int mid=(i+j)/2;
//接着对切分的两部分分别进行归并排序
mergeSort(array, i, mid);
mergeSort(array, mid+1, j);
//合并两部分
merge(array,i,mid,j);
}
}
private void merge(int[] array, int i, int mid, int j) {
//前半部分长度
int m=mid-i+1;
//后半部分长度
int n=j-mid;
//创建两个数组用来存储两半部分
int[] a=new int[m+1];
int[] b=new int[n+1];
//为两半部分分别设置值
for(int k=0;k<m;k++){
a[k]=array[i+k];
}
for(int k=0;k<n;k++){
b[k]=array[mid+1+k];
}
//由于需要将两数组比较,逐一比较取出较小的,往原始数组的左起位置插入,为了满足当一边全部比较完了之后,另外一边能够依然作为一个较小的元素一一插入,这里,将最后一个元素设置为最大值
a[m]=Integer.MAX_VALUE;
b[n]=Integer.MAX_VALUE;
//重置m,n,分别指向a、b数组的起始位置
m=0;
n=0;
for(int k=i;k<=j;k++){
//将切分开来的两个数组,逐一进行比较(已排序),将较小的插入原始数组,并将索引后移动一位继续比较
if(a[m]<=b[n]){
array[k]=a[m];
m++;
}else{
array[k]=b[n];
n++;
}
}
}