先写 合并两个有序数组, 然后分治递归
动画演示:
https://visualgo.net/zh/sorting
public class MergeSort {
/**
* 归并排序
*/
public static int[] mergeSort(int[] array) {
if (array.length < 2) {
return array;
}
int mIndex = array.length / 2;
int[] yin = mergeSort(Arrays.copyOfRange(array, 0, mIndex));
int[] yang = mergeSort(Arrays.copyOfRange(array, mIndex, array.length));
System.out.println("yin: " + Arrays.toString(yin) + "--- yang: " + Arrays.toString(yang));
return merge(yin, yang);
}
/**
* 合并两个有序数组
* @param yin 数组1
* @param yang 数组2
* @return 合并后的有序数组
*/
public static int[] merge(int[] yin, int[] yang) {
int i = 0;
int j = 0;
int[] result = new int[yin.length + yang.length];
int rIndex = 0;
while (i < yin.length && j < yang.length) {
if (yin[i] < yang[j]) {
result[rIndex] = yin[i];
i ++;
} else {
result[rIndex] = yang[j];
j++;
}
rIndex++;
}
if (i < yin.length) {
for (int k = i; k < yin.length; k++, rIndex++) {
result[rIndex] = yin[k];
}
}
if (j < yang.length) {
for (int k = j; k < yang.length; k++, rIndex++) {
result[rIndex] = yang[k];
}
}
System.out.println("marge result: " + Arrays.toString(result));
return result;
}
public static void main(String[] args) {
int[] arr = {2, 33, 443, 3232, 3, 33, 12, -11};
System.out.println(Arrays.toString(mergeSort(arr)));
}
}
输出:
yin: [2]--- yang: [33]
marge result: [2, 33]
yin: [443]--- yang: [3232]
marge result: [443, 3232]
yin: [2, 33]--- yang: [443, 3232]
marge result: [2, 33, 443, 3232]
yin: [3]--- yang: [33]
marge result: [3, 33]
yin: [12]--- yang: [-11]
marge result: [-11, 12]
yin: [3, 33]--- yang: [-11, 12]
marge result: [-11, 3, 12, 33]
yin: [2, 33, 443, 3232]--- yang: [-11, 3, 12, 33]
marge result: [-11, 2, 3, 12, 33, 33, 443, 3232]