排序算法----归并排序

特点

稳定
采用分治法
java对象排序专用,归并排序的改进排序Timsort

基本思想

把数组从中间分成两个,对这两个子序列分别采用归并排序;将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。

时空复杂度

时间复杂度:
平均:O(nlog2n)
最好:O(nlog2n)
最坏:O(nlog2n)
空间复杂度:O(n);

算法描述

把长度为n的输入序列分成两个长度为n/2的子序列;
对这两个子序列分别采用归并排序;
将两个排序好的子序列合并成一个最终的排序序列。
动画演示

算法

/**
     *      归并排序,分割
     * @param arr   数组
     * @param left  左边界
     * @param right     右边界
     */
    public static void mergeSort(int[] arr, int left, int right) {
        if (left == right) {
            //System.out.println("left=" + left);
            return;
        }
        //分成两半
        int mid = left + (right-left)/2;
        //左边排序
        mergeSort(arr,left,mid);
        //右边排序
        mergeSort(arr,mid+1,right);
        //合并
        merge(arr,left,mid+1,right);

    }

    /**
     *  归并排序,把两个分支合起来
     *
     * @param arr   待排序的数组
     * @param leftPtr   左指针
     * @param rightPtr  右指针
     * @param rightBound    右边界
     */
    private static void merge(int[] arr,int leftPtr,int rightPtr,int rightBound) {
        int mid = rightPtr-1;
        //临时变量,用来存储归并好的数组
        int[] temp = new int[rightBound-leftPtr+1];
        //三个指针,
        int i = leftPtr;
        int j = rightPtr;
        int k = 0;
        while(i <= mid && j <= rightBound){
            temp[k++] = arr[i] <= arr[j] ? arr[i++] : arr[j++];
        }
        while (i <= mid) temp[k++] = arr[i++];
        while (j <= rightBound) temp[k++] = arr[j++];
        //System.out.println("temp[]");
        //print(temp);

        for (int m = 0; m < temp.length; m++)   arr[leftPtr + m] = temp[m];
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值