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是一门需要在JAVA虚拟机(JVM)上运行的语言,因此Java源代码无法直接转化为Windows或Linux操作系统上的可执行文件。不过,Java提供了一个工具——Java打包工具(jar工具),你可以使用它将Java代码、构成代码所需的依赖文件(如类库)、配置文件等打包成一个可执行的jar文件。接下来是我们提供的java生成可执行文件(制作可执行文…

    Java 2023年5月19日
    00
  • Spring Data JPA框架的Repository自定义实现详解

    Spring Data JPA是Spring框架中用于简化JPA的使用的框架,其底层依赖了Hibernate。而Spring Data JPA框架的Repository接口提供了许多内置的方法来完成数据访问的功能,但如果需要执行一些特殊的查询操作,我们需要自定义Repository实现。下面我们详细介绍如何自定义Repository实现。 1. 创建自定义R…

    Java 2023年5月20日
    00
  • Sprint Boot @JsonIgnore使用方法详解

    @JsonIgnore是Spring Boot中的一个注解,用于标记某个字段或方法不参与序列化或反序列化。在本文中,我们将详细介绍@JsonIgnore注解的作用和使用方法,并提供两个示例。 @JsonIgnore注解的作用 @JsonIgnore注解用于标记某个字段或方法不参与序列化或反序列化。当使用@JsonIgnore注解标记某个字段或方法时,该字段或…

    Java 2023年5月5日
    00
  • spring-Kafka中的@KafkaListener深入源码解读

    Spring-Kafka中的@KafkaListener深入源码解读 在Spring-Kafka框架中,@KafkaListener注解用于监听Kafka中的消息。在本文中,我会详细讲解@KafkaListener注解的原理,以及如何在代码中使用它。 @KafkaListener的源码解析 @KafkaListener注解的作用是将一个方法标记为Kafka消…

    Java 2023年5月20日
    00
  • springboot + mybatis配置多数据源示例

    下面就是关于“springboot + mybatis配置多数据源示例”的完整攻略: 1. 添加依赖 在pom.xml文件中添加以下依赖: <dependencies> <!–spring-boot-starter-web是Spring Boot web应用常用依赖 –> <dependency> <groupI…

    Java 2023年5月20日
    00
  • SpringBoot配置文件格式详细介绍

    Spring Boot是一个快速开发框架,可以帮助开发人员快速构建Web应用程序。在开发过程中,经常需要使用配置文件来配置应用程序的行为。Spring Boot支持多种配置文件格式,本文将介绍Spring Boot的配置文件格式,并提供两个示例。 Spring Boot的配置文件格式 Spring Boot支持以下几种配置文件格式: .properties:…

    Java 2023年5月15日
    00
  • Java的Struts框架中Action的编写与拦截器的使用方法

    下面是关于“Java的Struts框架中Action的编写与拦截器的使用方法”的攻略。 Struts框架 Struts是一种流行的MVC(Model-View-Controller)Java Web框架。它允许将应用程序的内容(模型)、用户界面(视图)和应用程序流程(控制器)分开,这样不同的开发人员可以专注于不同的方面。 Action的编写 Action是S…

    Java 2023年5月20日
    00
  • Java压力测试的作用是什么?

    Java压力测试是通过模拟多种条件下访问量或请求量的情况来测试系统各项指标并找到系统的瓶颈,从而提高系统的性能。在实际环境中,当访问量或请求量大于系统能够处理的上限时,系统就会出现各种问题,如服务器宕机、响应时间变慢、数据丢失等。 以下是Java压力测试的具体使用攻略: 1. 安装jmeter Jmeter是一款免费的Java压力测试工具,可以通过官方网站下…

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