Java排序算法之归并排序

本文介绍了归并排序的基本思想,通过分治法将序列拆分成子序列,并分别对这些子序列进行排序,最后将它们合并成一个有序序列。文章提供了详细的Java代码实现,包括递归算法的实现方式,同时分析了该算法的时间复杂度、空间复杂度及稳定性。

基本思想:

     归并排序利用分治法,先将一个序列分成一个个子序列,然后对子序列进行排序,再把有序子序列合并为整体有序序列。

图片来自于http://www.cnblogs.com/shudonghe/p/3302888.html

Java代码实现:

public class GuiBing {
    
    public static void main(String[] args) {
        int[] a = { 14, 12, 15, 13, 11, 16 };
        sort(a, 0, a.length-1);
    }
    
    //使用递归算法
    public static void sort(int[] a, int left, int right) {
        if (left >= right)
            return;

        int center = (left + right) >> 1;
        sort(a, left, center);
        sort(a, center + 1, right);
        merge(a, left, center, right);
    }

    public static void merge(int[] data, int left, int center, int right) {
        int[] tmpArr = new int[right+1];
        int mid = center + 1;
        int index = left; // index记录临时数组的索引
        int tmp = left;

        // 从两个数组中取出最小的放入中临时数组
        while (left <= center && mid <= right) {
            tmpArr[index++] = (data[left] <= data[mid]) ? data[left++]: data[mid++];
        }
        // 剩余部分依次放入临时数组
        while (mid <= right) {
            tmpArr[index++] = data[mid++];
        }
        while (left <= center) {
            tmpArr[index++] = data[left++];
        }
        // 将临时数组中的内容复制回原数组
        for (int i = tmp; i <= right; i++) {
            data[i] = tmpArr[i];
        }
        System.out.println(Arrays.toString(data));
    }

}

算法性能分析:

时间复杂度:最坏最好和平均时间复杂度均为O(nlogn)

空间复杂度:归并排序需要一个大小为n的临时存储空间用以保存合并序列,所以空间复杂度为O(n)

算法稳定性:在归并排序中,相等的元素的顺序不会改变,所以它是稳定的算法。

转载于:https://www.cnblogs.com/love-Stefanie/p/6743413.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值