归并排序

基础排序参考
https://blog.csdn.net/yushiyi6453/article/details/76407640

归并排序

归并排序从小到大排序:首先让数组中的每一个数单独成为长度为1的区间,然后两两一组有序合并,得到长度为2的有序区间,依次进行,直到合成整个区间。

代码实现

package sort;

import java.util.Scanner;

/**
 * @author 王筱哲
 * @Data: 2019/8/1
 * @Time: 15:12
 */

public class MergeSort {
    /**
     * 归并排序
     */

    public static void main(String[] args{
        Scanner scanner = new Scanner(System.in);
        int[] arr = new int[5];
        for (int i = 0; i < arr.length; i++) {
            arr[i] = scanner.nextInt();
        }
        int[] ints = mergeSort(arr, 0, arr.length - 1);
        for (int i = 0; i < ints.length; i++) {
            System.out.println(arr[i]);
        }
    }

    public static int[] mergeSort(int[] arr, int left, int right{
        if (left == right) {
            return arr;
        }
        int mid = (left + right) / 2;
        mergeSort(arr, 0, mid);
        mergeSort(arr, mid + 1, right);
        mergn(arr, left, mid, right);
        return arr;
    }

     public static void mergn(int[] arr, int l, int m, int r{
        int[] help = new int[r - l + 1];
        int i = 0;
        int p1 = l;
        int p2 = m + 1;
        while (p1 <= m && p2 <= r) {
            help[i++] = arr[p1] < arr[p2] ? arr[p1++] : arr[p2++];
        }
        /**p1没有越界,p2必定越界*/
        while (p1 <= m) {
            help[i++] = arr[p1++];
        }
        /**p2没有越界,p1必定越界*/
        while (p2 <= r) {
            help[i++] = arr[p2++];
        }

        for (i = 0; i < help.length; i++) {
            arr[l + i] = help[i];
        }
    }
}

平均时间复杂度:O(nlogn) 最坏时间复杂度:O(nlogn) 空间复杂度:O(n) 稳定

原文地址:https://www.cnblogs.com/wuhen8866/p/11907523.html