1.归并排序简介
2.归并排图解
3.代码
public class MergeSort {
public static void main(String[] args) {
int[] arr = {8,4,5,3,7,9,6,2,1};
int[] temp = new int[arr.length];
mergeSort(arr,0,arr.length-1,temp);
System.out.println(Arrays.toString(arr));
}
/**
* 分+合
* 利用栈,将每一次分的数组进行排序后合并
* @param arr
* @param left
* @param right
* @param temp
*/
public static void mergeSort(int[] arr,int left,int right,int[] temp){
if (left<right){
int mind = (left+right)/2;//中间索引
//向左递归分解
mergeSort(arr,left,mind,temp);
//向左递归分解
mergeSort(arr,mind+1,right,temp);
//合并
merge(arr,left,right,mind,temp);
}
}
/**
*合并部分
* @param arr 待排序数组
* @param left 左边有序序列的初始索引
* @param right 左边有序序列的最后一个值的索引
* @param mind arr的中间索引
* @param temp 做中转的数组
*/
public static void merge(int[] arr,int left,int right,int mind,int[] temp){
int i = left;//初始化i:左边有序序列的初始索引
int j = mind + 1;//初始j:右边有序序列的初始索引
int t=0;//t指向temp的当前位置,也就是要存入数据的位置
//把左右两个序列的数据按照规则天才到temp数组,直到两个数组有一个处理完为止
//i<=mind&&j<=right:表示左右两边都没有遍历完
while (i <= mind && j <= right){
//将小的数填充到temp数组索引为t的位置
if(arr[i] <= arr[j]){
temp[t] = arr[i];
t += 1;
i += 1;
}else {
temp[t] = arr[j];
t += 1;
j += 1;
}
}
//把剩余数组依此填充到temp数组
while (i<=mind){//左边有剩余
temp[t] = arr[i];
i += 1;
t += 1;
}
while (j<=right){//右边有剩余
temp[t] = arr[j];
j += 1;
t += 1;
}
//将temp数组拷贝到arr
t=0;
int tempLeft = left;
while (tempLeft<=right){
arr[tempLeft] = temp[t];
t += 1;
tempLeft += 1;
}
}
}