B站相关视频链接:
https://www.bilibili.com/video/BV1Ax411U7Xx?from=search&seid=4353605022032697603
public class Main
{
public static void main (String[] args)
{
int[] array = {2,5,6,1,4,3,9,6};
int L = 0;
int R = array.length - 1;
//int M = L + (R - L) / 2;
mergeSort(array, L, R);
for(int i = 0; i < array.length; ++i) {
System.out.println(array[i] + " ");
}
}
//将一个数组(array数组)的前半部分有序(left数组) + 后半部分有序(right数组) 合并成一整个有序数组
private static void merge(int[] array, int L, int R) {
//System.out.println(" merge " + " L : " + L + " R : " + R);
int M = L + (R - L) / 2;
System.out.println(" merge " + " L : " + L + " R : " + R + " M " + M);
int[] left = new int[M - L + 1];
int[] right = new int[R - M];
int i = 0;
int j = 0;
int k = L;
for (int t = 0; t < left.length; ++t) {
left[t] = array[L + t];
System.out.println(" left[] " + left[t]);
}
for (int t = 0; t < right.length; ++t) {
right[t] = array[M + 1 + t];
System.out.println(" right[] " + right[t]);
}
while (i < left.length && j < right.length) {
if (left[i] <= right[j]) {
array[k ++] = left[i ++];
} else {
array[k ++] = right[j ++];
}
}
System.out.println(i);
System.out.println(j);
while (i < left.length) {
System.out.println("while i");
array[k ++] = left[i ++];
}
while (j < right.length) {
System.out.println("while j");
array[k ++] = right[j ++];
}
}
//分治,从M处递归的切一刀切一刀切一刀,递归停止条件是: L == R,即小数组中只剩一个元素
private static void mergeSort(int[] array, int L, int R) {
//System.out.println(" mergeSort " + "L : " + L + " R : " + R);
if (L < R) {
int M = L + (R - L) / 2;
System.out.println(" mergeSort " + " L : " + L + " R : " + R + " M " + M);
mergeSort(array, L, M);
mergeSort(array, M + 1, R);
merge(array, L, R);
} else {
return;
}
}
}
运行结果:
mergeSort L : 0 R : 7 M 3
mergeSort L : 0 R : 3 M 1
mergeSort L : 0 R : 1 M 0
merge L : 0 R : 1 M 0
left[] 2
right[] 5
1
0
while j
mergeSort L : 2 R : 3 M 2
merge L : 2 R : 3 M 2
left[] 6
right[] 1
0
1
while i
merge L : 0 R : 3 M 1
left[] 2
left[] 5
right[] 1
right[] 6
2
1
while j
mergeSort L : 4 R : 7 M 5
mergeSort L : 4 R : 5 M 4
merge L : 4 R : 5 M 4
left[] 4
right[] 3
0
1
while i
mergeSort L : 6 R : 7 M 6
merge L : 6 R : 7 M 6
left[] 9
right[] 6
0
1
while i
merge L : 4 R : 7 M 5
left[] 3
left[] 4
right[] 6
right[] 9
2
0
while j
while j
merge L : 0 R : 7 M 3
left[] 1
left[] 2
left[] 5
left[] 6
right[] 3
right[] 4
right[] 6
right[] 9
4
2
while j
while j
1
2
3
4
5
6
6
9