归并排序 {8,4,5,7}的图解
package com.atguigu.sort;
import java.util.Arrays;
public class MyMergeSort {
public static void main(String[] args) {
int[] arr = {8,4,5,7,1,3,6,2};
int[] temp = new int[arr.length];
mergeSort(arr,0,arr.length -1,temp);
System.out.println(Arrays.toString(arr));
}
public static void mergeSort(int[] arr ,int left , int right,int[] temp){
if(left < right){
int mid = (left + right)/2;
mergeSort(arr,left,mid,temp);
mergeSort(arr,mid+1,right,temp);
merge(arr,left,mid,right,temp);
}
}
/**
*
* @param arr 待排序的数组
* @param left 左子表最左边的初始索引
* @param mid 中间索引
* @param right 右子表最右边的初始索引
* @param temp 临时数组,用于中转
*/
public static void merge(int[] arr , int left ,int mid , int right , int[] temp){
int i = left;//用于扫描左子表
int j = mid + 1;//用于扫描右子表
int t = 0;//用于遍历临时数组
//扫描左右子表,比较大小后,将较小的放入temp中,直到处理完其中一个子表
while(i <= mid && j <= right){//i j指针没有超过各自子表的范围,说明都还没处理完,要继续比大小
if(arr[i] < arr[j]){
temp[t] = arr[i];
t++;
i++;
}else {
temp[t] = arr[j];
t++;
j++;
}
}
//退出循环,说明其中有一个子表已经处理完,需要将未处理完的子表中的剩余元素拷贝到temp中
while(i <= mid){
temp[t] = arr[i];
t++;
i++;
}
while(j <= right){
temp[t] = arr[j];
t++;
j++;
}
//将temp数组拷贝到arr数组
t = 0;
while(left <= right){
arr[left] = temp[t];
left++;
t++;
}
}
}