思想:归并排序是利用归并的思想实现的排序算法,该算法采用经典的分治策略(分治法将问题分成一些小的问题然后递归求解,而治的阶段则将分的阶段得到的各答案‘修补’在一起,即分而治之)。
形象化:
代码:
import java.util.Arrays;
public class MergetSort {
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);
}
}
//合并方法
/*
* left左边有序数列的初始索引
* mid中间索引
* right右边索引
* temp中转数组
* */
public static void merge(int[] arr,int left,int mid,int right,int temp[]){
int i=left;//初始化i,左边有序数列的初始索引
int j=mid+1;//初始化j,右边有序数列的初始索引
int t=0;//指向temp数组的当前索引
//先把左右两边(有序)的数据按照规则填充到temp数组中
//直到左右两把的有序序列,有一边处理完毕为止
while (i<=mid&&j<=right){
if (arr[i]<arr[j]){
temp[t]=arr[i];
t+=1;
i+=1;
}else {//反之,将右边有序序列当前元素填充到temp数组中
temp[t]=arr[j];
t+=1;
j+=1;
}
}
//把有剩余数据的一边的数据依次填充到temp
while (i<=mid){
temp[t]=arr[i];
t+=1;
i+=1;
}
while (j<=right){
temp[t]=arr[j];
t+=1;
j+=1;
}
//将temp数组的元素拷贝到arr
t=0;
int templeft=left;
// templeft right
//第一次合并的是索引为 0 1
//第二次 2 3
//第三次 0 3
//第四次 4 5
//第五次 6 7
//第六次 4 7
//第七次 0 7
//如上图红色字体
while (templeft<=right){
arr[templeft]=temp[t];
t+=1;
templeft+=1;
}
}
}