原理:
1、先拆分、在合并,合并的过程中借助临时空间进行排序
2、拆分:从中间位置拆开,分为左右两部分,继续操作,直到个数为1时停止
3、将拆分后的数据进行两两比较排序,逐渐增加(2、4、8···)
代码:
package 排序;
import java.util.Arrays;
public class MergeSort {
public static void main(String[] args) {
int[] arr = {4,8,6,2,7,1};
split(arr,0,arr.length-1);
System.out.println(Arrays.toString(arr));
}
//拆分
public static void split(int[] arr,int left,int right) {
if(left==right) {
return;
}
int i = (left+right)/2;
//向左递归
split(arr,left,i);
//向右递归
split(arr,i+1,right);
//合并
merge(arr,left,i,right);
}
//合并
public static void merge(int[] arr,int left,int mid,int right) {
int s1 = left;
int s2 = mid+1;
//临时数组
int temp[] = new int[right-left+1];
//临时数组的下标
int index = 0;
while(s1<=mid&&s2<=right) {
if(arr[s1]<arr[s2]) {
temp[index] = arr[s1];
index++;
s1++;
}else {
temp[index] = arr[s2];
index++;
s2++;
}
}
//判断s1当中是否有数据
while(s1<=mid) {
temp[index] = arr[s1];
index++;
s1++;
}
//判断s2当中是否有数据
while(s2<=right) {
temp[index] = arr[s2];
index++;
s2++;
}
//临时数组当中的数值放回原数组
for(int j=0;j<temp.length;j++) {
arr[left+j] = temp[j];
}
}
}