package com.furun.demo.sort;
import java.util.Arrays;
/**
* @author wufurun
* @version 1.0
* @ClassName: MegrSort
* @Description: 归并排序
* @date 2021/4/5 8:02
*/
public class MegrSort {
public static void main(String[] args){
int[] data = {9,8,3,7,2,6,5,4,1};
sort(data,0,data.length-1);
System.out.println(Arrays.toString(data));
}
/**
*该方法中merg归并排序比较费解,从sort方法开辟栈帧的维度去理解
* 每一层sort栈帧都有merg,递到最底层一个元素时,开始回溯归并排序
*/
public static void sort(int[] data,int left,int right){
if(left<right){ //相等时就已经是一个元素一组了
int mid = (right+left)/2;
sort(data,left,mid);
sort(data,mid+1,right);
merg(data,left,mid,right);
}
}
private static void merg(int[] data, int left, int mid, int right) {
int temp[] = new int[data.length]; //中间数组
int point1 = left;//左边的第一个元素
int point2 = mid+1;//右边的第一个元素
int loc = left; //表示的是temp数组写数据的位置
while(point1<=mid && point2<=right){ // 每次比较 取小的数放到临时数组的下一个位置
if(data[point1]<data[point2]){
temp[loc] = data[point1];
point1++;
loc++;
}else{
temp[loc] = data[point2];
point2++;
loc++;
}
}
while(point1<=mid){// 如果左边还有大的元素,依次拿过来
temp[loc++] = data[point1++];
}
while(point2<=right){//如果右边还有大的元素,依次拿过来
temp[loc++] = data[point2++];
}
for (int i = left; i <=right ; i++) { //将原数组相应位置的元素替换为中间数组的有序数据
data[i] = temp[i];
}
}
}
更详细文章参考:
图解排序算法(四)之归并排序