【算法】归并排序(递归)-Java版本

一、归并排序定义

基于归并的思想进行排序,该算法采用分治策略。

分:将问题分解成小问题然后递归求解,排序中即将数据序列分解为越来越小的子序列,之后再对子序列进行排序;

治:将分阶段得到的结果进行补充、合并。

归并排序是稳定排序,每次合并操作的平均时间复杂度是O(n),最好最坏的平均时间复杂度均是O(nlogn)。

二、算法原理

过程描述

以一个例子说明“分”的过程:

Caption

基于上图,得到的两个子序列,如何合并相邻有序的子序列?

三、代码实现

本文选用递归方式实现归并排序(也可使用迭代方式实现)

package com.hadoop.bd.algorithm;

import java.util.Arrays;

/**
 * @Author He Bao Jing
 * @Date 2019-02-10 10:23
 */
public class MergeSortDemo {
    public static void main(String[] args) {
        int[] arr = new int[]{2, 1, 4, 3, 5};
        int len = arr.length;
        int[] tmp = new int[len];
        sort(arr, 0, len - 1, tmp);
        System.out.println(Arrays.toString(arr));
    }

    private static void sort(int[] arr, int left, int right, int[] tmp) {
        if (left < right) {
            int mid = (left + right) / 2;
            sort(arr, left, mid, tmp);
            sort(arr, mid + 1, right, tmp);
            mergeSort(arr, left, mid, right, tmp);
        }
    }

    private static void mergeSort(int[] arr, int left, int mid, int right, int[] tmp) {
        int i = left;
        int j = mid + 1;
        int k = 0;
        while (i <= mid && j <= right) {
            if (arr[i] <= arr[j]) {
                tmp[k] = arr[i];
                k++;
                i++;
            } else {
                tmp[k] = arr[j];
                k++;
                j++;
            }
        }
        while (i <= mid) {
            tmp[k++] = arr[i++];
        }
        while (j <= right) {
            tmp[k++] = arr[j++];
        }

        k = 0;
        while (left <= right) {
            arr[left++] = tmp[k++];
        }
    }
}

四、引用

https://www.cnblogs.com/chengxiao/p/6194356.html

https://www.cnblogs.com/Java3y/p/8631584.html

猜你喜欢

转载自blog.csdn.net/hebaojing/article/details/86900146