归并排序是创建在归并操作上的一种有效的排序算法,效率为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];
}
}
}