- 今天在别人的博客看到一篇非常好的归并排序的解释,而且带上图解和动图,代码非常清晰简介
- https://www.jianshu.com/p/33cffa1ce613
(1)归并排序流程
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200128235306389.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3doaXRlX3p6Wg==,size_16,color_FFFFFF,t_70)
(2)合并两个
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200128235359406.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3doaXRlX3p6Wg==,size_16,color_FFFFFF,t_70)
(3)代码
public static void mergeSort(int[] arr) {
sort(arr, 0, arr.length - 1);
}
public static void sort(int[] arr, int L, int R) {
if(L == R) {
return;
}
int mid = L + ((R - L) >> 1);
sort(arr, L, mid);
sort(arr, mid + 1, R);
merge(arr, L, mid, R);
}
public static void merge(int[] arr, int L, int mid, int R) {
int[] temp = new int[R - L + 1];
int i = 0;
int p1 = L;
int p2 = mid + 1;
while(p1 <= mid && p2 <= R) {
temp[i++] = arr[p1] < arr[p2] ? arr[p1++] : arr[p2++];
}
while(p1 <= mid) {
temp[i++] = arr[p1++];
}
while(p2 <= R) {
temp[i++] = arr[p2++];
}
for(i = 0; i < temp.length; i++) {
arr[L + i] = temp[i];
}
}