复习:归并排序

* 归并排序
* 最好时间复杂度、最坏时间复杂度、平均时间复杂度都是o(nlog2n)
* 和堆排序、快速排序的时间复杂度一样
* <p>
* 空间复杂度:o(n)
**
 * 归并排序
 * 最好时间复杂度、最坏时间复杂度、平均时间复杂度都是o(nlog2n)
 * 和堆排序、快速排序的时间复杂度一样
 * <p>
 * 空间复杂度:o(n)
 */
public class MergeSort {

    public static void main(String[] args) {
        int[] arr = {49, 38, 65, 97, 76, 13, 27, 49};
        mergeSort(arr,0,arr.length-1);
        System.out.println(Arrays.toString(arr));
    }

    public static void mergeSort(int[] arr,int low,int high) {
        //这里mid的计算容易出错
        //int mid = (high-low)/2+low;
        int mid = (low+high)/2;
        if (low < high){
            mergeSort(arr,low,mid);
            mergeSort(arr,mid+1,high);
            merge(arr,low,mid,high);
        }
    }

    /**
     * 从low(含)到mid(含)为第一个已经排好序的子序列
     * 从mid+1(含)到high(含)为第二个已经排好序的子序列
     * 现在要把这两个子序列归并为一个有序的序列
     *
     * @param arr
     * @param low
     * @param mid
     * @param high
     */
    public static void merge(int[] arr, int low, int mid, int high) {

        int[] newArr = new int[arr.length];
        for (int i = low; i <= high; i++) {
            newArr[i] = arr[i];
        }

        int i = low, j = mid + 1, k = low;
        while (i <= mid && j <= high) {
            while (i <= mid && j <= high && newArr[i] <= newArr[j]) {
                arr[k] = newArr[i];
                i++;
                k++;
            }
            while ( i <= mid && j <= high && newArr[i] > newArr[j]) {
                arr[k] = newArr[j];
                j++;
                k++;
            }
        }
        while (i <= mid) {
            arr[k++] = newArr[i++];
        }
        while( j <= high){
            arr[k++] = newArr[j++];
        }
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值