package merger;
import com.sun.tools.javac.util.ArrayUtils;
/**
* 归并算法
*/
public class Test1 {
public static void main(String[] args) {
int[] numbers={
1,4,9,33,2,55,24,6,99};
mergerSort(numbers);
for (Integer i: numbers ) {
System.out.println(i);
}
}
static void mergerSort(int[] s){
merger(s,0,s.length-1);
}
static void merger(int[] s,int left,int right){
//
if (left>=right){
return;
}
int mid=(right+left)/2;
merger(s,left,mid);
merger(s,mid+1,right);
handle(s,left,mid,right);
}
private static void handle(int[] s, int left, int mid, int right) {
int[] temp=new int[right-left+1];
int i=left;
int j=mid+1;
int k=0;
while (i<=mid&&j<=right){
if (s[i]>=s[j]){
temp[k++]=s[j++];
}else{
temp[k++]=s[i++];
}
}
while (i<=mid){
temp[k++]=s[i++];
}
while (j<=right){
temp[k++]=s[j++];
}
for (int l=0;l<temp.length;l++) {
s[left+l]=temp[l];
}
}
}
首先引入代码,代码的精髓在于递归的过程
static void merger(int[] s,int left,int right){
//
if (left>=right){
return;
}
int mid=(right+left)/2;
merger(s,left,mid);
merger(s,mid+1,right);
handle(s,left,mid,right);
}
我们把这段代码拿出分析
画图分析递归过程
我们假设传入的参数是16584,这里只看索引下标,并不看内容。
在这里插入图片描述
其实由图很容易就能看出来类似于树形结构就一种遍历,先遍历左边的所有节点,再从底下往上面遍历右节点。递归思路就很清晰了