【排序算法】 归并排序 merge sort

来源:互联网 发布:淘宝开店货源一件代发 编辑:程序博客网 时间:2024/04/29 22:20

【排序算法】 归并排序 merge sort

归并排序思路

归并排序的基本思想基于递归地拆分和合并,将两个或两个以上有序表合并成一个新的有序表。

将整个区间递归地拆分为小区间(最小的区间长度为1),然后递归地合并两个有序的区间。

时间复杂度

expense:
平均时间复杂度 O(N*log(N))
最坏时间复杂度 O(N*log(N))
最好时间复杂度 O(N*log(N))

空间复杂度O(N)

应用场景

归并排序实现

package algorithm.algorithm4.ch02_sort;import org.junit.Test;import java.util.Arrays;import java.util.Random;/** * description: * algorithm: merge sort,归并排序 * @author liyazhou * @create 2017-06-21 14:41 */public class Merge {    public static void sort(Comparable[] arr){        if (arr == null || arr.length < 2) return;        Comparable[] aux = new Comparable[arr.length];  // 归并排序所需要的辅助空间        sort(arr, 0, arr.length-1, aux);    }    private static void sort(Comparable[] arr, int low, int high, Comparable[] aux) {        if (low >= high) return;        int mid = low + (high - low)/2;        sort(arr, low, mid, aux);           // 将左部区间排序        sort(arr, mid+1, high, aux);        // 将右部区间排序        merge(arr, low, mid, high, aux);    // 归并左右两部分区间的结果    }    /**     * 合并位于 [low, mid] 和 [mid+1, high] 这两段闭区间内的元素     * 每一个区间的内部都是有序的     * @param arr 序列     * @param low 开始索引     * @param mid 中间索引     * @param high 末尾索引     * @param aux 辅助空间     */    private static void merge(Comparable[] arr, int low, int mid, int high, Comparable[] aux) {        int i = low;        int j = mid + 1;        for (int k = low; k <= high; k ++) aux[k] = arr[k];        int k = low;        while (i <= mid && j <= high){            if (aux[i].compareTo(aux[j]) < 0) arr[k++] = aux[i++];            else                              arr[k++] = aux[j++];        }        while (i <= mid) arr[k++] = aux[i++];        while (j <= high) arr[k++] = aux[j++];    }    @Test    public void test(){        Random random = new Random();        int N = 20;        Integer[] arr = new Integer[N];        for (int i = 0; i < N; i ++) arr[i] = random.nextInt(100);        System.out.println(Arrays.toString(arr));        Merge.sort(arr);        System.out.println(Arrays.toString(arr));    }}
原创粉丝点击