排序算法(四)归并排序


算法思路

  归并排序有以下几个步骤:

  • 将数组分成左右两个部分。
  • 对左边进行排序。
  • 对右边进行排序。
  • 使用排外序的方法将左右两边合并。

时间复杂度

  根据Master公式,归并排序的时间复杂度为O(N * logN)。

代码

public class MergeSort {
    /**
     * 利用递归实现归并排序
     */
    public static void mergeSort(int[] arr, int left, int right) {
        // 当left == right时,数组在left到right范围内是有序的,直接返回
        if (ArrayUtil.isEmpty(arr) || left == right) {
            return;
        }

        // 得到数组中间位置下标
        int mid = left + ((right - left) >> 1);
        // 对左边进行排序
        mergeSort(arr, left, mid);
        // 对右边进行排序
        mergeSort(arr, mid + 1, right);
        // 将左右两边合并
        merge(arr, left, mid, right);
    }

    /**
     * 归并
     * 这个过程,时间复杂度为 O(N)
     */
    public static void merge(int[] arr, int left, int mid, int right) {
        int length = right - left + 1;
        int[] help = new int[length];
        int leftPointer = left;
        int rightPointer = mid + 1;
        int helpPointer = 0;
        while (leftPointer <= mid && rightPointer <= right) {
            if (arr[leftPointer] < arr[rightPointer]) {
                help[helpPointer++] = arr[leftPointer++];
            } else {
                help[helpPointer++] = arr[rightPointer++];
            }
        }

        if (leftPointer <= mid) {
            System.arraycopy(arr, leftPointer, help, helpPointer, mid - leftPointer + 1);
        }
        if (rightPointer <= right) {
            System.arraycopy(arr, rightPointer, help, helpPointer, right - rightPointer + 1);
        }

        System.arraycopy(help, 0, arr, left, length);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值