归并排序

106 阅读1分钟
/**
 * 归并排序
 * 个人理解:1.分治法思想(将复杂问题分成多个相同或相似的独立问题,递归解决后合并)
 *  2.时间复杂度,二分拆解,所以最好最坏都是O(nlogn)
 *  3.空间复杂度,使用到临时数组,所以是O(n)
 *  4.稳定性,相邻元素比较,稳定
 */
public class MergeSort {

    public static void main(String[] args) {
        int[] arr = {70, 12, 82, 43, 99, 23, 38, 53, 22};

        mergeSort(arr, 0, arr.length-1);
        Arrays.stream(arr).forEach(a->System.out.print(a+" "));
    }

    public static void mergeSort(int[] arr, int start, int end) {
        if (start >= end) {
            return;
        }
        int mid = (start + end)/2;
        //分解
        mergeSort(arr, start, mid);
        mergeSort(arr, mid+1, end);

        //二路归并
        merge(arr, start, mid, end);
    }

    private static void merge(int[] arr, int start, int mid, int end) {
        int s1 = start;
        int s2 = mid+1;
        int e1 = mid;
        int e2 = end;
        int[] tmp = new int[end-start+1];
        int k = 0;

        while (s1 <= e1 && s2 <= e2) {
            if (arr[s1] < arr[s2]) {
                tmp[k++] = arr[s1++];
            } else {
                tmp[k++] = arr[s2++];
            }
        }
        while (s1 <= e1) tmp[k++] = arr[s1++];
        while (s2 <= e2) tmp[k++] = arr[s2++];

        for (int i=0; i<k; i++) {
            arr[start+i] = tmp[i];
        }
    }

}