Java归并排序

概念

归并排序: 归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。
优点: 时间复杂度O(n*logn),空间复杂度S(n),是一种稳定的算法(保证大小相同的元素排序后的顺序不变)
算法思想: 将多个有序表合并成一个新的有序表。无序 → 部分有序 → 有序

简单图解

有一串无序数组
在这里插入图片描述
1. 拆分 首先将他们无限二分,直到每一块只有一个元素
在这里插入图片描述
我们就会得到n个元素
在这里插入图片描述
2. 归并 将拆分的多个序列两两排序组合形成新的序列,直到合成所有序列
在这里插入图片描述
归并时创建一个临时数组来保存需要排序的数据,然后定义两个指针分别指向两个待排序合并的序列,比较两个指针的值来放入数组完成排序合并

代码实现

public class MergeSort {
    public void mergeSort(int[] arr, int left, int right) {
        // 左大于右则不需要继续拆分
        if (left >= right) {
            return;
        }
        // 找到中间点
        int mid = (left + right) / 2;
        // 以中间点为间隔对左右分别继续排序直到剩余一个元素
        mergeSort(arr, left, mid);
        mergeSort(arr, mid + 1, right);
        // 比较两个有序序列的大小,如果左边比右边大则排序合并
        if (arr[mid] > arr[mid + 1]) {
            merge(arr, left, mid, right);
        }
    }

    private void merge(int[] arr, int left, int mid, int right) {
        int[] aux = new int[right - left + 1];
        for (int i = 0; i < aux.length; i++) {
            aux[i] = arr[i + left];
        }
        // 定义左边序列指针
        int i = 0;
        // 定义右边序列指针
        int j = mid + 1 - left;
        // 将拆分数组排序合并到原数组
        for (int k = left; k <= right; k++) {
            if (i > mid - left) {
                // 左边小的已经排序完毕 指针超过拆分后数组的长度 此时直接将右边指针所指的数据放入
                arr[k] = aux[j];
                // 放入后右指针后移
                j++;
            } else if (j > right - left) {
                // 则表明右边序列指针已经超过长度 将左边序列指针所指的值直接放入数组 指针后移
                arr[k] = aux[i];
                i++;
            } else if (aux[i] <= aux[j]) {
                // 左指针所指的值小于等于右指针的值,直接放入数组后左指针后移
                arr[k] = aux[i];
                i++;
            } else {
                // 和上面相反
                arr[k] = aux[j];
                j++;
            }
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java归并排序是一种排序算法,它将数组切分为较小的部分,然后递归地对这些部分进行排序,并最后将它们合并起来。在Java中,归并排序是通过底层的Arrays.sort()方法实现的[1]。下面是Java归并排序的一般步骤和代码实现。 1. 定义一个mergeSort()方法,该方法接受一个数组a和两个整数lo和hi作为参数。这个方法用来进行递归调用,对数组的指定部分进行排序。 2. 在mergeSort()方法中,首先创建一个与数组大小相同的临时数组temp,用于存放排序后的元素。 3. 然后,调用另一个mergeSort()方法,该方法接受一个数组a和四个整数lo、hi、mid作为参数。这个方法用来进行归并操作,将数组的两个子数组合并成一个有序数组。 4. 在mergeSort()方法中,首先计算切分点mid,然后判断子数组的长度是否大于1,如果大于1则继续拆分子数组。 5. 接下来,递归地调用mergeSort()方法对两个子数组进行排序,分别传入参数a、temp、lo、mid和a、temp、mid+1、hi。 6. 最后,在mergeSort()方法中调用merge()方法将两个子数组合并成一个有序数组。 Java归并排序的核心是merge()方法,该方法将两个有序子数组合并成一个有序数组。 总结起来,Java归并排序通过递归地将数组划分为较小的部分,并合并这些部分以获得最终的排序结果。这种排序算法Java中被广泛应用,并且可以在源码中找到其实现。 参考文献: 麦田怪圈 (Crop Circle), 维基百科, https://zh.wikipedia.org/wiki/麥田怪圈 人为制作麦田怪圈的方法, 百度百科, https://baike.baidu.com/item/人为制作麦田怪圈的方法 归并排序, 维基百科, https://zh.wikipedia.org/wiki/归并排序<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [归并排序详解,Java版描述。](https://blog.csdn.net/weixin_30539625/article/details/97734524)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值