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函数将数组分割至只有一个元素再合并,最终得到排序数组。

阅读剩余 46%

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

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

相关文章

  • Java内存溢出的几个区域总结(注意避坑!)

    Java内存溢出的几个区域总结(注意避坑!) 在Java应用程序中,如何管理和控制内存使用是非常重要的。Java虚拟机管理内存的方式不同于C++或其他语言,因为Java虚拟机使用堆区域来分配内存,并且具有垃圾回收机制。然而,这些不同也使得Java应用程序容易遭遇内存溢出错误。在这篇文章中,我们将概述Java中主要的内存区域,如何避免内存泄漏和内存溢出错误。 …

    Java 2023年5月27日
    00
  • idea2020.3测试评价及感受

    IDEA 2020.3测试评价及感受 概述 IntelliJ IDEA 2020.3是一款集成开发环境,旨在提供给Java、Kotlin等开发者使用。本文将深入探讨该版本的测试评价及感受。 安装及配置 在官方网站(https://www.jetbrains.com/idea/)下载.idea2020.3版本软件,然后按照提示进行安装。如若使用社区版则无需激活…

    Java 2023年5月26日
    00
  • 如何使用Java锁?

    使用Java锁可以保证多线程下的数据访问与操作的线程安全性,下面详细讲解如何使用Java锁。 1. Java锁的基本使用 Java提供了几种类型的锁: synchronized关键字:synchronized关键字可以锁住代码块或方法,保证同一时刻只有一个线程可以执行锁住的代码 ReentrantLock类:ReentrantLock是Java提供的一种可重…

    Java 2023年5月11日
    00
  • Spring Boot深入排查 java.lang.ArrayStoreException异常

    Spring Boot深入排查 java.lang.ArrayStoreException异常攻略 异常说明 Java中的ArrayStoreException是一种运行时异常。它通常在向数组中存储了不兼容的对象类型时发生。当试图将一个对象赋值给一个数组的元素,而这个对象的类型与数组的声明类型不兼容时,就会出现该异常。 排查步骤 1.定位异常位置 当我们在S…

    Java 2023年6月2日
    00
  • 解析Java中的Field类和Method类

    解析Java中的Field类和Method类攻略 什么是Field类和Method类 Field类和Method类都是Java反射的重要组成部分。Field类代表一个类或者接口的属性(成员变量),Method类代表一个类或者接口中的方法。 使用这两个类可以在运行时获取并操作类或接口中的属性和方法信息。 如何使用Field类 在Java中,每个类都有它的属性(…

    Java 2023年5月26日
    00
  • JAVA如何定义构造函数过程解析

    Java中的构造函数用于创建新的对象实例,并对对象进行初始化。以下是JAVA如何定义构造函数的过程解析: 定义一个构造函数 要定义构造函数,请使用与类名称相同的名称,然后在名称后面添加括号。构造函数没有返回类型,因为它们总是返回正在创建的类的实例。 示例: public class Person { String name; // 构造函数 public P…

    Java 2023年5月26日
    00
  • JAVA生成pdf文件的实操指南

    JAVA生成PDF文件的实操指南 简介 PDF是一种非常流行的电子文档格式,很多公司和机构都会使用它作为文档的传播方式。对于JAVA开发者来说,生成PDF文件是一个常见的需求。在本篇指南中,我们将介绍如何使用JAVA生成PDF文件的方法,并提供两个示例帮助你更好地理解。 准备工作 在开始生成PDF文件之前,你需要确保以下的环境和工具已经准备就绪: Java …

    Java 2023年5月19日
    00
  • 使用SpringJPA 直接实现count(*)

    使用Spring JPA直接实现count(*)可以将统计查询的结果映射到Long类型的变量上,对于查询结果较多的场景,性能提升明显。具体操作步骤如下: 1. 定义JpaRepository 定义接口并继承JpaRepository,示例如下: @Repository public interface UserRepository extends JpaRe…

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