先写 合并两个有序数组, 然后分治递归
动画演示:
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]
