java 排序算法之归并排序

Java 排序算法之归并排序

算法简介

归并排序(Merge Sort)是一种基于分治思想的排序算法,其基本思想是将待排序的序列不断列表分割为子序列,直到每个子序列只有一个元素,然后将子序列两两合并并按照考虑的比较规则合并成一个有序的大序列,直到最后整个序列有序。

归并排序的时间复杂度为O(nlogn),稳定排序,但是需要额外的空间复杂度O(n),因为需要额外的空间用于合并序列。

示例说明

下面我们使用两个示例来演示归并排序的具体实现过程。

示例一

对于一个包含6个元素(4, 7, 3, 1, 9, 2)待排序的数组,下面是归并排序的具体实现过程。

  1. 将序列分割为两个子序列(4, 7, 3)和(1, 9, 2)。
  2. 对于每个子序列递归调用归并排序,得到两个有序的子序列(3, 4, 7)和(1, 2, 9)。
  3. 合并两个有序子序列,得到最终有序序列(1, 2, 3, 4, 7, 9)。

示例二

对于一个包含8个元素(5, 8, 6, 3, 9, 2, 1, 7)待排序的数组,下面是归并排序的具体实现过程。

  1. 将序列分割为两个子序列(5, 8, 6, 3)和(9, 2, 1, 7)。
  2. 将子序列(5, 8, 6, 3)分割为两个子序列(5, 8)和(6, 3)。
  3. 对于每个子序列递归调用归并排序,得到两个有序的子序列(5, 8)和(3, 6)。
  4. 合并两个有序子序列,得到有序子序列(3, 5, 6, 8)。
  5. 将子序列(9, 2, 1, 7)分割为两个子序列(9, 2)和(1, 7)。
  6. 对于每个子序列递归调用归并排序,得到两个有序的子序列(2, 9)和(1, 7)。
  7. 合并两个有序子序列,得到有序子序列(1, 2, 7, 9)。
  8. 合并两个有序子序列(3, 5, 6, 8)和(1, 2, 7, 9),得到最终有序序列(1, 2, 3, 5, 6, 7, 8, 9)。

Java 代码实现

下面给出 Java 语言实现归并排序算法的代码。

public class MergeSort {
    public static void merge(int[] arr, int start, int mid, int end) {
        int[] tmpArr = new int[end - start + 1];
        int i = start;
        int j = mid + 1;
        int k = 0;
        while(i <= mid && j <= end) {
            if(arr[i] <= arr[j])
                tmpArr[k++] = arr[i++];
            else
                tmpArr[k++] = arr[j++];
        }
        while(i <= mid)
            tmpArr[k++] = arr[i++];
        while(j <= end)
            tmpArr[k++] = arr[j++];
        for(i = 0, k = start; k <= end; i++, k++) {
            arr[k] = tmpArr[i];
        }
    }

    public static void mergeSort(int[] arr, int start, int end) {
        if(start >= end)
            return;
        int mid = start + (end - start) / 2;
        mergeSort(arr, start, mid);
        mergeSort(arr, mid+1, end);
        merge(arr, start, mid, end);
    }

    public static void main(String[] args) {
        int[] arr = new int[] {5,8,6,3,9,2,1,7};
        mergeSort(arr, 0, arr.length - 1);
        for(int i : arr)
            System.out.print(i + " ");
    }
}

在上述代码中,merge函数用于合并两个有序子序列(start,mid)和(mid + 1,end),递归调用mergeSort函数将数组分割至只有一个元素再合并,最终得到排序数组。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java 排序算法之归并排序 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • Java倒计时三种实现方式代码实例

    首先我们需要了解倒计时的基本概念和工作原理。倒计时是指从一个特定的时间开始向下计数,直到达到预定目标时间。在计数过程中需要实时更新显示时间。Java提供了多种实现方式,下面将分别进行介绍。 基于Thread类实现倒计时 实现步骤 继承Thread类,重写run()方法,在该方法中实现倒计时的逻辑。 在run()方法中使用Thread.sleep()方法控制倒…

    Java 2023年5月18日
    00
  • Java后端用EL表达式改进JSP

    下面是“Java后端用EL表达式改进JSP”的完整攻略。 1. 什么是EL表达式 EL(Expression Language)表达式是一种特殊的语言结构,它提供了一种简化JSP页面中Java代码的方式。EL表达式的作用是为了获得和操作Java对象的值,而无需编写完整的Java程序。EL表达式通常用于JSP页面中,可以直接访问JavaBean中的属性,并且可…

    Java 2023年5月20日
    00
  • SpringBoot 自定义注解实现涉密字段脱敏

    下面是详细的攻略: 简介 在实际项目中,很多时候需要对涉密字段进行脱敏,以保护用户隐私,比如手机号、身份证号、银行卡号等。本文将介绍如何使用 SpringBoot 自定义注解来实现涉密字段的脱敏功能。 步骤 定义注解 首先需要定义一个注解,用于标识需要脱敏的字段。可以自定义一个 @SensitiveInfo 注解,该注解可以用在类、字段、方法等地方。注解可以…

    Java 2023年6月3日
    00
  • Java实现英文猜词游戏的示例代码

    Java实现英文猜词游戏的示例代码 简介 英文猜词是一种简单而有趣的游戏。在这个游戏中,计算机会随机选取一个单词,并将其中的字母都用空格代替。玩家需要猜出这个单词是什么,并逐步填充每一个空格。每次猜错都会导致玩家失去一部分生命值,当生命值归零时,游戏结束。 本文将分享如何使用Java来实现这样一个英文猜词游戏。以下是完整的示例代码: import java.…

    Java 2023年5月19日
    00
  • Java实现抽奖算法的示例代码

    这里是Java实现抽奖算法的完整攻略: 抽奖算法简介 抽奖算法是一种随机算法,可以用于随机选出指定数量的中奖用户。在实现抽奖算法时,我们需要考虑到以下几个因素: 每个用户是否有资格参与抽奖; 不同中奖的概率; 中奖的数量。 根据这三个因素,我们可以实现不同策略的抽奖算法。下面的示例中,我们将实现两种常见的抽奖算法。 示例一:固定中奖数量,中奖率相等 如果我们…

    Java 2023年5月19日
    00
  • Java中实现获取路径的方法汇总

    Java中实现获取路径的方法可以使用多种方式,常用的有以下几种: 1. 使用Class.getResource(String path)方法获取资源路径 // 获取classpath下src/main/resources目录下的test.txt文件的URL对象 URL resourceUrl = getClass().getResource("/t…

    Java 2023年6月15日
    00
  • 解决JDBC的class.forName()问题

    解决 JDBC 的 Class.forName() 问题 在使用 JDBC 连接数据库时,我们通常使用的是以下代码: Class.forName("com.mysql.cj.jdbc.Driver"); Connection conn = DriverManager.getConnection(url, username, passwor…

    Java 2023年6月16日
    00
  • SpringBoot实现项目健康检查与监控

    实现项目健康检查与监控是一个较为常见的需求,可以通过Spring Boot Actuator提供的功能来轻松实现,下面是使用Spring Boot Actuator实现项目健康检查与监控的攻略: 1. 添加依赖 首先需要在项目中引入Spring Boot Actuator的相关依赖,在项目的pom.xml文件中添加以下依赖: <dependency&g…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部