归并排序算法

归并排序(Merge Sort)算法是一种分治思想的递归算法。

快速排序算法不同的是,归并排序是先排序小数组再排序大数组,而快速排序是先处理大数组再处理小数组。

时间复杂度O(n \log n)

空间复杂度O(n)

其中 n 是数组的长度。

排序算法步骤

1 要排序的数组是a ,其元素数量为n ,设当前处理的数组长度m = 2

2 对所有长度为m的子数组进行归并(注意此时数组m的左半数组和右半数组是有序的)

  2.1 申请长度为m的数组t作为额外空间

  2.2 将左右两边的有序数组从小到大填到数组t中

  2.3 将数组t中的元素复制回原数组a

3 若m >= n则直接结束,否则设m = m * 2,回到步骤2

java代码实现

import java.util.Arrays;

public class MergeSort {

    public static void mergeSort(int[] a) {
        int[] t = new int[a.length];
        mergeSort(a, 0, a.length - 1, t);
    }

    public static void mergeSort(int[] a, int left, int right, int[] t) {
        if (left >= right) {
            return;
        }

        int middle = (left + right) / 2;
        mergeSort(a, left, middle, t);
        mergeSort(a, middle + 1, right, t);
        merge(a, left, middle, right, t);
    }

    public static void merge(int[] a, int left, int middle, int right, int[] t) {
        for (int i = left, l = left, r = middle + 1; i <= right; i++) {
            if (l > middle) {
                t[i] = a[r++];
            } else if (r > right) {
                t[i] = a[l++];
            } else if (a[l] <= a[r]) {
                t[i] = a[l++];
            } else { // a[l] > a[r]
                t[i] = a[r++];
            }
        }

        System.arraycopy(t, left, a, left, right - left + 1);
    }

    public static void main(String[] args) {
        int[] a = new int[] { 3, 4, 2, 1, 5 };
        mergeSort(a);
        System.out.println(Arrays.toString(a));
    }
}

源代码地址https://github.com/SSSxCCC/Algorithm

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SSSxCCC

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值