当前位置: 首页 > article >正文

Java算法之归并排序(Merge Sort)

归并排序简介

归并排序是一种采用分治法的排序算法,它将排序问题分解为多个较小的子问题来解决,然后将这些子问题的解合并以得到原问题的解。归并排序以其稳定性和高效率而著称,尤其适用于大数据集的排序。

算法原理

归并排序的基本步骤包括:

  1. 分解:将数组递归地分成两半,直到每个子数组只有一个元素。
  2. 解决:由于每个只有一个元素的子数组自然是有序的,不需要排序。
  3. 合并:将已排序的子数组合并成更大的有序数组,直到最终得到完全有序的数组。

代码实现

以下是使用Java实现归并排序的示例代码:

public class MergeSort {
    // 主函数,用于启动归并排序
    public static void mergeSort(int[] arr, int l, int r) {
        if (l < r) {
            // 计算中间索引
            int m = l + (r - l) / 2;
            // 分别对左右两半进行排序
            mergeSort(arr, l, m);
            mergeSort(arr, m + 1, r);
            // 合并已排序的左右两半
            merge(arr, l, m, r);
        }
    }

    // 辅助函数,用于合并两个有序数组
    private static void merge(int[] arr, int l, int m, int r) {
        // 临时数组,用于存放合并后的有序数组
        int n1 = m - l + 1;
        int n2 = r - m;

        // 创建临时数组
        int[] L = new int[n1];
        int[] R = new int[n2];

        // 复制数据到临时数组
        System.arraycopy(arr, l, L, 0, n1);
        System.arraycopy(arr, m + 1, R, 0, n2);

        // 合并临时数组回到原数组arr[l..r]
        int i = 0, j = 0;
        int k = l;
        while (i < n1 && j < n2) {
            if (L[i] <= R[j]) {
                arr[k] = L[i];
                i++;
            } else {
                arr[k] = R[j];
                j++;
            }
            k++;
        }

        // 复制左数组中的剩余元素
        while (i < n1) {
            arr[k] = L[i];
            i++;
            k++;
        }

        // 复制右数组中的剩余元素
        while (j < n2) {
            arr[k] = R[j];
            j++;
            k++;
        }
    }

    public static void main(String[] args) {
        int[] arr = {12, 11, 13, 5, 6, 7};
        mergeSort(arr, 0, arr.length - 1);
        System.out.println("排序后的数组: ");
        for (int value : arr) {
            System.out.print(value + " ");
        }
    }
}

优缺点分析

优点

  • 稳定性:归并排序是稳定的排序算法,相等的元素在排序后保持原有的顺序。
  • 效率:时间复杂度为O(n log n),在大多数情况下都表现良好,尤其适合大数据集。
  • 并行性:归并排序可以很容易地并行化,提高在多核处理器上的性能。

缺点

  • 空间复杂度:归并排序不是原地排序算法,它需要额外的存储空间来存储临时数组,空间复杂度为O(n)。
  • 内存使用:由于需要额外的内存,对于内存受限的系统,归并排序可能不是最佳选择。

使用场景

  • 大数据集:归并排序适合对大数据集进行排序,尤其是在需要稳定排序的情况下。
  • 外部排序:当数据存储在外部存储器上,如磁盘,归并排序可以有效减少I/O操作。
  • 多核处理器:在多核处理器上,归并排序可以通过并行化来提高性能。

结语

归并排序是一种非常强大的排序算法,它通过分治法有效地解决了大规模数据集的排序问题。虽然它需要额外的内存空间,但其稳定性和高效率使其成为许多应用场景下的首选算法


http://www.kler.cn/a/285062.html

相关文章:

  • Django 的 ModelViewSet 中的 get_queryset 方法自定义查询集
  • 【C++ 算法进阶】算法提升十三
  • 如何在 Ubuntu 16.04 上设置 NFS 挂载
  • 把握鸿蒙生态崛起的机遇:开发者视角的探讨
  • 人工智能(AI)和机器学习(ML)技术学习流程
  • 文本语义分块、RAG 系统的分块难题:小型语言模型如何找到最佳断点
  • 【Godot4.3】MarkDown解析和生成类 - MDdoc
  • 仿华为车机功能之--修改Launcher3,实现横向滑动桌面空白处切换壁纸
  • 在Ubuntu 20.04上安装MySQL的方法
  • 神经网络搭建实战与Sequential的使用
  • 南京观海微电子----VCC、 VDD、VSS、VEE 电压符号解释
  • <Rust>egui学习之小部件(八):如何在窗口中添加滑动条slider部件?
  • Vue.js入门系列(十九):深入理解和应用组件自定义事件
  • C++宏展开
  • 2024.08.28 C++初学
  • Notepad++回车不自动补全
  • Python算法工程师面试整理-概率与统计
  • 数学基础 -- 线性代数之矩阵因式分解
  • 计算多图的等价无向图的邻接链表表示
  • MySQL中日期和时间戳的转换:字符到DATE和TIMESTAMP的相互转换
  • OpenHarmony 实战开发——一文总结ACE代码框架
  • 在多云生态下,如何实现跨云的自动化身份管理?
  • 【React】从零开始搭建 react 项目(初始化+路由)
  • Linux虚拟机搭建K8S环境
  • 通过Dot1q终结子接口实现VLAN间互访
  • python基础操作