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

    图解说明:

    Merge-sort-example-300px.gif

    java代码实现

    1. package com.test;
    2. /**
    3. * 归并排序
    4. */
    5. public class MergeSort {
    6. public static void main(String[] args) {
    7. int[] arr = {6, 5, 3, 1, 8, 7, 2, 4};
    8. merge_sort(arr, 0, arr.length - 1);
    9. for (int i : arr) {
    10. System.out.println(i);
    11. }
    12. }
    13. public static void merge_sort(int[] arr, int p, int r) {
    14. if (p < r) {
    15. int q = (p + r) / 2; //中间值
    16. merge_sort(arr, p, q); //递归调用左半边,分成两组
    17. merge_sort(arr, q + 1, r); //递归调用右半边,分成两组
    18. merge(arr, p, q, r); //分完后排序
    19. }
    20. }
    21. public static void merge(int[] arr, int p, int q, int r) {
    22. int len = r - p + 1; //长度
    23. int[] tmp = new int[len]; //临时数组
    24. int i = p, j = q + 1; //两段[p, q][q+1,r]
    25. int k = 0;
    26. while (i <= q && j <= r) {//比较最小的存入tmp数组
    27. if (arr[i] < arr[j]) {
    28. tmp[k++] = arr[i++];
    29. } else {
    30. tmp[k++] = arr[j++];
    31. }
    32. }
    33. //i,j其中一个已经全部放入临时数组中
    34. while (i <= q) {
    35. tmp[k++] = arr[i++];
    36. }
    37. while (j <= r) {
    38. tmp[k++] = arr[j++];
    39. }
    40. //tmp赋给原数组
    41. for (int m = 0; m < len; m++) {
    42. arr[m + p] = tmp[m];
    43. }
    44. }
    45. }