java 中归并排序算法详解

yizhihongxing

Java 中归并排序算法详解

算法介绍

归并排序是一种稳定的分治算法,时间复杂度为 O(nlogn),相较于快速排序,归并排序对于需要稳定排序的数据更加适用。

算法步骤

归并排序的主要思想是分治,即将一个大的问题分解为若干个小问题,解决每个小问题,然后合并得到最终的解决方案。

归并排序的具体步骤如下:

  1. 分解:将待排序的数组分解为若干个小数组,直到每个小数组仅包含一个元素,即认为每个小数组本身有序。
  2. 归并:将小数组两两合并,形成更大的有序数组。重复该步骤,直到所有的小数组合并成一个大的有序数组。

实现示例

以下为 Java 实现归并排序算法的示例代码:

public class MergeSort {
    private void merge(int[] arr, int left, int mid, int right) {
        int[] temp = new int[right - left + 1];
        int i = left, j = mid + 1, k = 0;
        while (i <= mid && j <= right) {
            if (arr[i] < arr[j]) {
                temp[k] = arr[i];
                k++;
                i++;
            } else {
                temp[k] = arr[j];
                k++;
                j++;
            }
        }
        while (i <= mid) {
            temp[k] = arr[i];
            k++;
            i++;
        }
        while (j <= right) {
            temp[k] = arr[j];
            k++;
            j++;
        }
        for (int p = 0; p < temp.length; p++) {
            arr[left + p] = temp[p];
        }
    }

    private void mergeSort(int[] arr, int left, int right) {
        if (left >= right) {
            return;
        }
        int mid = left + (right - left) / 2;
        mergeSort(arr, left, mid);
        mergeSort(arr, mid + 1, right);
        merge(arr, left, mid, right);
    }

    public void sort(int[] arr) {
        if (arr == null || arr.length == 0) {
            return;
        }
        mergeSort(arr, 0, arr.length - 1);
    }
}

其中,merge 方法实现数组的合并,mergeSort 方法实现递归分解数组及合并有序数组,sort 方法对外暴露调用接口,调用时需要传入待排序的数组。

以下为使用示例:

public static void main(String[] args) {
    int[] arr = {5, 3, 7, 2, 8, 4, 1, 6};
    MergeSort mergeSort = new MergeSort();
    mergeSort.sort(arr);
    System.out.println(Arrays.toString(arr));
}

输出结果为:

[1, 2, 3, 4, 5, 6, 7, 8]

另外一个示例是将一个字符串数组按照字典序排序:

public static void main(String[] args) {
    String[] arr = {"hello", "world", "java", "merge", "sort"};
    MergeSort mergeSort = new MergeSort();
    mergeSort.sort(arr);
    System.out.println(Arrays.toString(arr));
}

输出结果为:

[java, hello, merge, sort, world]

总结

归并排序是一种常用的排序算法,稳定而快速。本文详细讲解了该算法的实现细节和示例代码。

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

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • python-当只有一个输入时 如何处理minmaxscaler?

    Python – 当只有一个输入时如何处理MinMaxScaler? 在使用MinMaxScaler对数据进行归一化时,如果只有一个输入,需要进行特处理。本文将提供一些关于如何处理这种情况的详细说明,包括如何使用numpy和sklearn库进行处理。 numpy进行处理 要使用numpy进行处理,请按照以下步骤操作: 导入numpy库: python imp…

    other 2023年5月9日
    00
  • Java面试题冲刺第六天–网络编程1

    这里是Java面试题冲刺第六天–网络编程1的完整攻略。 网络编程基础 计算机网络体系结构 计算机网络体系结构分为五层,自下而上分别为物理层,数据链路层,网络层,传输层和应用层。其中应用层是最上层,为用户直接提供服务。 IP地址和端口号 IP地址和端口号是计算机在网络上进行通信的两个重要组成部分。IP地址是唯一标识一个计算机在网络中的位置,端口号则是唯一标识…

    other 2023年6月27日
    00
  • Android Studio轻松构建自定义模板的步骤记录

    下面我将介绍“Android Studio轻松构建自定义模板的步骤记录”的完整攻略。 简介 Android Studio中的模板是一种快速生成常见代码结构的工具。使用模板可以使您的开发更加高效,并帮助您避免手动编写重复的代码。Android Studio中自带了一些模板,但您还可以轻松地创建自己的模板。 步骤 创建自定义模板的步骤如下: 创建模板 在Andr…

    other 2023年6月25日
    00
  • IOS开发自定义view方法规范示例

    下面我将为大家分享如何制作iOS开发自定义view的方法规范示例。 什么是自定义view 自定义view是指程序员自己定义的在iOS应用中用来显示内容的视图控件,可以自己控制视图的外观和行为,更灵活地满足业务需求。 自定义view可以具有以下特点: 可以自由定义视图外观 可以自定义视图的交互 可以封装业务逻辑 制作自定义view的步骤 继承UIView类,实…

    other 2023年6月25日
    00
  • Android 中 Activity显示隐式跳转

    Android 中 Activity显示隐式跳转的完整攻略 在Android开发中,Activity之间的跳转是非常常见的操作。除了使用显式跳转外,Android还支持使用隐式跳转进行Activity的跳转。本攻略将详细讲解如何在Android中使用隐式跳转来实现Activity之间的跳转。 1. 创建目标Activity 首先,我们需要创建目标Activi…

    other 2023年6月28日
    00
  • 魔兽世界7.3.5野德怎样输出 猫德团本大秘境输出手法及技能循环

    魔兽世界野德输出攻略 猫德团本大秘境输出手法及技能循环 输出装备和统计 在开始讲解猫德输出手法之前,我们需要先介绍一下猫德输出所需的装备和统计。 推荐装备: 大部分装备以爆发为主,并且需要有较高的全能属性和暴击率,优先选择带有爆发加成的套装。 统计要求: 急速率在25%左右,精通120%以上,暴击在35%以上,全能属性在1万点以上。 猫德技能循环 虚空割裂:…

    other 2023年6月27日
    00
  • 关于树:使用和理解matlab的treebagger(随机森林)方法

    以下是关于“关于树:使用和理解matlab的treebagger(随机森林)方法”的完整攻略,包含两个示例说明。 什么是随机森林 随机森林是一种集成学习方法,它由个决策树组成。每个决策树都是基于随机选择的特征和样本构建的。随机森林可以用于回归问题,并且具有很好的准确性和鲁棒性。 使用treebagger函数 在MATLAB中,我们可以使用treebagger…

    other 2023年5月9日
    00
  • word入门级添加交叉引用到同步更新引用编号

    Word入门级添加交叉引用到同步更新引用编号 在Word文档中,交叉引用是一种非常有用的功能,它可以帮助我们在文中引用其他部分的内容。在本文中,我们将详细解如何添加交叉引用,并同步更新引用编号的完整攻略。 1. 添加交叉引用 以下是在Word文档中添加交叉引用的步骤: 在文档中选择要引用的内容,例如标题、图表、表格等。 在“插入”选项卡中,单击“交叉引用”按…

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