首页 > 编程语言 >Java版归并排序 演示代码(带注释)

Java版归并排序 演示代码(带注释)

时间:2023-07-08 22:46:36浏览次数:52  
标签:sort 归并 演示 int arr param mid 数组 Java

Code:

import java.util.Arrays;

/**
 * 归并排序
 */
public class MergeSort {
    /**
     * 私有化
     */
    private MergeSort() {}

    /**
     * 归并排序的sort方法
     * @param arr 待排序数组
     * @param <E> 可比较的元素
     */
    public static <E extends Comparable<E>> void sort(E[] arr) {
        sort(arr, 0, arr.length - 1);
    }

    /**
     * 内部sort方法
     * @param arr 待排序数组
     * @param l 左边界索引
     * @param r 右边界索引
     * @param <E> 元素类型(必须可比较)
     */
    private static <E extends Comparable<E>> void sort(E[] arr, int l, int r) {
        // 递归终止条件
        if (l >= r) {
            return;
        }
        // 分为两部分,取其中间索引(分治)
        int mid = (l + r) / 2;
        sort(arr, l, mid);
        sort(arr, mid + 1, r);
        // 将排好序的两部分合二为一(合并)
        merge(arr, l, mid, r);
    }

    /**
     * 合并两个有序的区间 arr[l, mid] 和 arr[mid+1, r]
     * @param arr 待排序数组(整个数组或部分)
     * @param l 数组索引的左边界
     * @param mid 数组的中间索引
     * @param r 数组索引的右边界
     * @param <E> 元素类型
     */
    private static <E extends Comparable<E>> void merge(E[] arr, int l, int mid, int r) {
        // 备份数组的[l, r]区间
        E[] tmp = Arrays.copyOfRange(arr, l, r + 1);

        // 指针i,指向左半部的开头
        int i = l;
        // 指针j,指向右半部的开头
        int j = mid + 1;

        // 为[l, r]区间的arr排序
        for (int k = l; k <= r; k++) {
            // 如果i指针移动到了mid之外(右)
            // 则说明数组左侧部分已经全部遍历过了
            if (i > mid) {
                arr[k] = tmp[j - l];
                j++;
            }
            // 如果j指针也移动出了r边界
            // 则数组左侧部分已经完成遍历,这时处理左数组即可
            else if (j > r) {
                arr[k] = tmp[i - l];
                i++;
            }
            // 如果i指针在左半边数组的索引范围内
            // 且j指针也在右半边数组的索引范围之内
            // 则比较i,j两索引上的元素大小
            else if (tmp[i - l].compareTo(tmp[j - l]) <= 0) {
                // tmp[i] <= tmp[j]
                arr[k] = tmp[i - l];
                i++;
            }
            // 剩下的一种情况,i,j均未越界,且tmp[i] > tmp[j]
            else {
                arr[k] = tmp[j - l];
                j++;
            }
        }
    }

    public static void main(String[] args) {
        Integer[] arr = {9, -1, 5, 8, 2, 17, 7, 0, 6};
        MergeSort.sort(arr);
        for (int item : arr) {
            System.out.println(item);
        }
    }
}

 

标签:sort,归并,演示,int,arr,param,mid,数组,Java
From: https://www.cnblogs.com/fanqshun/p/17538030.html

相关文章

  • JAVA_DAY04
    第四天基本数据类型使用:基本数据类型变量名=数据值;inti=1;引用数据类型使用:1.导包:指明要使用类型存在的位置import包名.类名;(权限定名)package包信息的下面,class类型的上面2.定义引用数据类型的变量|引用引用数据类型变量名|引用名=new引......
  • 一个Bug,让我发现了Java界的.AJ(锥)
    目录 一、前言二、满脑子都是骚操作1.遇到问题2.发现问题3.排查问题三、如何正确使用Aspect的.aj类1.安装AspectJ2.AspectJ插件3.添加依赖aspectjrt.jar4.配置AspectJ编译器5.案例测试四、总结五、系列推荐 一、前言话我放这,踩过的坑越多......
  • 一个Bug,让我发现了Java界的.AJ(锥)
    目录一、前言二、满脑子都是骚操作1.遇到问题2.发现问题3.排查问题三、如何正确使用Aspect的.aj类1.安装AspectJ2.AspectJ插件3.添加依赖aspectjrt.jar4.配置AspectJ编译器5.案例测试四、总结五、系列推荐一、前言话我放这,踩过的坑越多头发越少!说来也是奇怪,只要是学......
  • Java中AQS的原理与实现
    目录1:什么是AQS?2:AQS都有那些用途?3:我们如何使用AQS4:AQS的实现原理5:对AQS的设计与实现的一些思考1:什么是AQS​ 随着计算机的算力越来越强大,各种各样的并行编程模型也随即踊跃而来,但当我们要在并行计算中使用共享资源的时候,就需要利用一种手段控制对共享资源的访问和修改来......
  • 2012 javascript
    javascript  学习列表   BodyButtonCanvasEvent                                                                 02/07FormFrameFramesetIFrameImage                     ......
  • 已经配置了`JAVA_HOME`环境变量,但Tomcat仍然提示未配置该变量
    检查JAVA_HOME变量的正确性:确保JAVA_HOME的值指向JavaJDK的安装路径,而不是JRE的路径。例如,JAVA_HOME应该是类似于C:\ProgramFiles\Java\jdk1.8.0_XXX的路径,而不是C:\ProgramFiles\Java\jre1.8.0_XXX。检查环境变量配置位置:确保将JAVA_HOME变量添加到系统环境变量中,而不仅......
  • java通过注解和反射优雅的实现数据脱敏
     数据脱敏是对分为数据库数据脱敏与接口脱敏。其中数据库入库数据脱敏方式我们一般采用对称加密来实现数据脱敏,接口脱敏我们一般用遮罩方式实现数据脱敏比如用“*”占位。本文章主要介绍接口脱敏方式。 1.定义一个自定义注解类importjava.lang.annotation.*;@Target(Elem......
  • java入门概念个人理解之package与import浅析
    java入门概念个人理解之package与import浅析由于近来学习java,遇到了一些在c++上没有的概念,将它记http://录下,以自己复习使用,如有不理解妥之处,望大家批评指导。资料均由网上经过自己整合理解而来,如有侵权请通知我将起删除即可。我就以package与import开始吧。package的作用其实就是......
  • 一次简单的Java服务性能优化,实现压测 QPS 翻倍
    背景前段时间我们的服务遇到了性能瓶颈,由于前期需求太急没有注意这方面的优化,到了要还技术债的时候就非常痛苦了。在很低的QPS压力下服务器load就能达到10-20,CPU使用率60%以上,而且在每次流量峰值时接口都会大量报错,虽然使用了服务熔断框架Hystrix,但熔断后服务却迟迟不......
  • Java学习
    JDBC核心api使用步骤:1注册驱动,依赖的jar包,进行安装2.建立连接connection3.创建发送SQL语句对象4.statement对象(小汽车),发送SQL语句到数据库并且返回获取结果5.解析结果集6.销毁(释放)资源:释放connection 释放statement 释放resultset......