归并排序

本文详细介绍了一种经典的排序算法——归并排序的基本思想及其Java实现过程。通过递归地将序列分成更小的部分,并将这些部分合并成有序序列来达到整个序列排序的目的。展示了排序前后数据的变化,有助于理解归并排序的运作机制。

基本思想:将待排序序列R[0…n-1]看成是n个长度为1的有序序列,将相邻的有序表成对归并,得到n/2个长度为2的有序表;将这些有序序列再次归并,得到n/4个长度为4的有序序列;如此反复进行下去,最后得到一个长度为n的有序序列。

实现代码

public class MergeSort
{
    public static void main(String[] args)
    {
        DataWrap[] dataWraps =
        { new DataWrap(9, ""), new DataWrap(-16, ""), new DataWrap(21, "*"),
                new DataWrap(23, ""), new DataWrap(-30, "*"),
                new DataWrap(-49, "*"), new DataWrap(21, ""),
                new DataWrap(30, "*"), new DataWrap(13, "*"),
                new DataWrap(15, ""), new DataWrap(28, "*"),
                new DataWrap(-2, "*") };
        System.out.println("排序之前:\n" + Arrays.toString(dataWraps));
        mergeSort(dataWraps);
        System.out.println("排序之后:\n" + Arrays.toString(dataWraps));
    }

    public static void mergeSort(DataWrap[] dataWraps)
    {
        sort(dataWraps, 0, dataWraps.length - 1);
    }

    private static void sort(DataWrap[] dataWraps, int left, int right)
    {
        if (left < right)
        {
            // 中间索引
            int center = (left + right) / 2;
            // 对左边数组进行递归
            sort(dataWraps, left, center);
            // 对右边数组进行递归
            sort(dataWraps, center + 1, right);
            System.out.println("left:" + left + " right:" + right);
            // 归并
            merge(dataWraps, left, center, right);
        }
    }

    private static void merge(DataWrap[] dataWraps, int left, int center,
            int right)
    {
        DataWrap[] arrTmp = new DataWrap[dataWraps.length];
        int mid = center + 1;
        int third = left;
        int tmp = left;
        while (left <= center && mid <= right)
        {
            // 将两个数组中取小放入临时数组
            if (dataWraps[left].compareTo(dataWraps[mid]) < 0)
            {
                arrTmp[third++] = dataWraps[left++];
            } else
            {
                arrTmp[third++] = dataWraps[mid++];
            }
        }
        // 原数组剩余部分放入临时数组
        while (mid <= right)
        {
            arrTmp[third++] = dataWraps[mid++];
        }
        while (left <= center)
        {
            arrTmp[third++] = dataWraps[left++];
        }
        // 临时数组内容拷贝到原数组
        while (tmp <= right)
        {
            dataWraps[tmp] = arrTmp[tmp++];
        }
        System.out.println(Arrays.toString(dataWraps));
    }
}

时间复杂度:O(n/log2n)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值