归并排序是创建在归并操作上的一种有效的排序算法,效率为O(nlogn)。1945年由约翰.冯.诺伊曼由此提出。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用,且各层分治递归可以同时进行。
图解说明:

java代码实现
package com.test;/*** 归并排序*/public class MergeSort {public static void main(String[] args) {int[] arr = {6, 5, 3, 1, 8, 7, 2, 4};merge_sort(arr, 0, arr.length - 1);for (int i : arr) {System.out.println(i);}}public static void merge_sort(int[] arr, int p, int r) {if (p < r) {int q = (p + r) / 2; //中间值merge_sort(arr, p, q); //递归调用左半边,分成两组merge_sort(arr, q + 1, r); //递归调用右半边,分成两组merge(arr, p, q, r); //分完后排序}}public static void merge(int[] arr, int p, int q, int r) {int len = r - p + 1; //长度int[] tmp = new int[len]; //临时数组int i = p, j = q + 1; //两段[p, q][q+1,r]int k = 0;while (i <= q && j <= r) {//比较最小的存入tmp数组if (arr[i] < arr[j]) {tmp[k++] = arr[i++];} else {tmp[k++] = arr[j++];}}//i,j其中一个已经全部放入临时数组中while (i <= q) {tmp[k++] = arr[i++];}while (j <= r) {tmp[k++] = arr[j++];}//tmp赋给原数组for (int m = 0; m < len; m++) {arr[m + p] = tmp[m];}}}
