【算法】归并排序的原理与Java实现

简介: 归并排序(Merge Sort)是一种经典的排序算法,基于分治(Divide and Conquer)策略。它将待排序的数组划分为多个子数组,然后分别对子数组进行排序,最后将排序好的子数组合并成一个有序的数组。归并排序的核心思想是将问题分解为更小的子问题,解决子问题后再将结果合并得到最终的解决方案。

一.归并排序原理


归并排序(Merge Sort)是一种经典的排序算法,基于分治(Divide and Conquer)策略。它将待排序的数组划分为多个子数组,然后分别对子数组进行排序,最后将排序好的子数组合并成一个有序的数组。归并排序的核心思想是将问题分解为更小的子问题,解决子问题后再将结果合并得到最终的解决方案。


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

1.将待排序的数组不断地二分,直到每个子数组只有一个元素。

2.对每个子数组进行排序,可以使用递归调用归并排序来实现排序。

3.将排序好的子数组逐个合并,得到更大的有序子数组,直到最终合并成一个有序的数组。


二.使用Java实现归并排序


public class MergeSort {
    public static void main(String[] args) {
        int[] arr = {5, 2, 8, 3, 1};
        System.out.println("Before sorting:");
        printArray(arr);
        mergeSort(arr);
        System.out.println("After sorting:");
        printArray(arr);
    }
    public static void mergeSort(int[] arr) {
        int n = arr.length;
        if (n <= 1) {
            return; // 数组已经有序或为空,无需排序
        }
        int mid = n / 2;
        int[] left = new int[mid];
        int[] right = new int[n - mid];
        // 将数组拆分为左右两个子数组
        System.arraycopy(arr, 0, left, 0, mid);
        System.arraycopy(arr, mid, right, 0, n - mid);
        // 递归排序左右子数组
        mergeSort(left);
        mergeSort(right);
        // 合并左右子数组
        merge(arr, left, right);
    }
    public static void merge(int[] arr, int[] left, int[] right) {
        int i = 0, j = 0, k = 0;
        while (i < left.length && j < right.length) {
            if (left[i] <= right[j]) {
                arr[k] = left[i];
                i++;
            } else {
                arr[k] = right[j];
                j++;
            }
            k++;
        }
        while (i < left.length) {
            arr[k] = left[i];
            i++;
            k++;
        }
        while (j < right.length) {
            arr[k] = right[j];
            j++;
            k++;
        }
    }
    public static void printArray(int[] arr) {
        for (int num : arr) {
            System.out.print(num + " ");
        }
        System.out.println();
    }
}

以上代码使用归并排序算法对一个整数数组进行排序。mergeSort方法实现了归并排序的逻辑,通过递归将数组拆分为左右两个子数组,并对子数组进行排序,最后再合并排序好的子数组。merge方法用于合并两个有序的子数组。


运行以上代码,将输出如下结果:

Before sorting:
5 2 8 3 1 
After sorting:
1 2 3 5 8

归并排序算法的时间复杂度为O(nlogn),其中n是数组的长度。它是一种稳定的排序算法,适用于任何规模的数组。归并排序相对于其他排序算法来说,虽然具有较高的时间复杂度,但是其稳定性和适用性使其成为一个重要的排序算法。

相关文章
|
1天前
|
监控 Java API
探索Java NIO:究竟在哪些领域能大显身手?揭秘原理、应用场景与官方示例代码
Java NIO(New IO)自Java SE 1.4引入,提供比传统IO更高效、灵活的操作,支持非阻塞IO和选择器特性,适用于高并发、高吞吐量场景。NIO的核心概念包括通道(Channel)、缓冲区(Buffer)和选择器(Selector),能实现多路复用和异步操作。其应用场景涵盖网络通信、文件操作、进程间通信及数据库操作等。NIO的优势在于提高并发性和性能,简化编程;但学习成本较高,且与传统IO存在不兼容性。尽管如此,NIO在构建高性能框架如Netty、Mina和Jetty中仍广泛应用。
14 3
|
1天前
|
安全 算法 Java
Java CAS原理和应用场景大揭秘:你掌握了吗?
CAS(Compare and Swap)是一种乐观锁机制,通过硬件指令实现原子操作,确保多线程环境下对共享变量的安全访问。它避免了传统互斥锁的性能开销和线程阻塞问题。CAS操作包含三个步骤:获取期望值、比较当前值与期望值是否相等、若相等则更新为新值。CAS广泛应用于高并发场景,如数据库事务、分布式锁、无锁数据结构等,但需注意ABA问题。Java中常用`java.util.concurrent.atomic`包下的类支持CAS操作。
18 2
|
1月前
|
存储 算法 Java
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
|
1月前
|
算法 容器
令牌桶算法原理及实现,图文详解
本文介绍令牌桶算法,一种常用的限流策略,通过恒定速率放入令牌,控制高并发场景下的流量,确保系统稳定运行。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
令牌桶算法原理及实现,图文详解
|
20天前
|
存储 人工智能 缓存
【AI系统】布局转换原理与算法
数据布局转换技术通过优化内存中数据的排布,提升程序执行效率,特别是对于缓存性能的影响显著。本文介绍了数据在内存中的排布方式,包括内存对齐、大小端存储等概念,并详细探讨了张量数据在内存中的排布,如行优先与列优先排布,以及在深度学习中常见的NCHW与NHWC两种数据布局方式。这些布局方式的选择直接影响到程序的性能,尤其是在GPU和CPU上的表现。此外,还讨论了连续与非连续张量的概念及其对性能的影响。
43 3
|
25天前
|
机器学习/深度学习 人工智能 算法
探索人工智能中的强化学习:原理、算法与应用
探索人工智能中的强化学习:原理、算法与应用
|
1月前
|
缓存 算法 网络协议
OSPF的路由计算算法:原理与应用
OSPF的路由计算算法:原理与应用
47 4
|
1月前
|
存储 算法 网络协议
OSPF的SPF算法介绍:原理、实现与应用
OSPF的SPF算法介绍:原理、实现与应用
80 3
|
25天前
|
机器学习/深度学习 人工智能 算法
探索人工智能中的强化学习:原理、算法及应用
探索人工智能中的强化学习:原理、算法及应用
|
19天前
|
算法
基于WOA算法的SVDD参数寻优matlab仿真
该程序利用鲸鱼优化算法(WOA)对支持向量数据描述(SVDD)模型的参数进行优化,以提高数据分类的准确性。通过MATLAB2022A实现,展示了不同信噪比(SNR)下模型的分类误差。WOA通过模拟鲸鱼捕食行为,动态调整SVDD参数,如惩罚因子C和核函数参数γ,以寻找最优参数组合,增强模型的鲁棒性和泛化能力。