网站首页 > java教程 正文
归并排序是一种基于分治思想的排序算法,它的时间复杂度为 O(nlogn)。
归并排序的基本思路是:将一个大问题分解成若干个小问题,逐步解决这些小问题,最终合并成一个解决方案。在归并排序中,我们将待排序的数组分成两个子数组,分别对这两个子数组进行排序,
然后将它们合并成一个有序的数组。
具体实现如下:
public class MergeSort {
    public static void mergeSort(int[] arr, int left, int right) {
        // 递归终止条件
        if (left < right) {
            // 计算中间位置
            int mid = (left + right) / 2;
            // 递归调用左半部分
            mergeSort(arr, left, mid);
            // 递归调用右半部分
            mergeSort(arr, mid + 1, right);
            // 合并左右两个有序数组
            merge(arr, left, mid, right);
        }
    }
    public static 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++];
            } else {
                temp[k++] = arr[j++];
            }
        }
        // 将左半部分剩余的元素复制到临时数组中
        while (i <= mid) {
            temp[k++] = arr[i++];
        }
        // 将右半部分剩余的元素复制到临时数组中
        while (j <= right) {
            temp[k++] = arr[j++];
        }
        // 将临时数组中的元素复制回原数组中
        for (i = left, k = 0; i <= right; i++, k++) {
            arr[i] = temp[k];
        }
    }
}
在这个实现中,我们首先将待排序的数组分成两个子数组,分别对这两个子数组进行递归排序,最后将它们合并成一个有序的数组。合并的过程是:将两个子数组合并成一个新的数组,然后比较新数组中相邻的两个元素,将较小的元素向前移动,直到新数组中的所有元素都是有序的。
归并排序的时间复杂度为 O(nlogn),空间复杂度为 O(n)。它的优点是稳定性好,缺点是需要额外的空间来存储临时数组。
注:点赞关注有更多技术交流期待哦
    
- 上一篇: 如何零基础学习VBA——数组函数介绍
 - 下一篇: 数据格式的转换方法,HSTACK函数重建数组
 
猜你喜欢
- 2025-05-11 全局数组的结构分析(全局数组和局部数组)
 - 2025-05-11 10秒合并800个表,VSTACK就是这么厉害!
 - 2025-05-11 VBA实现将批量Excel文件中的工作表合并成一个工作表
 - 2025-05-11 C语言之strcat字符串拼接函数(c语言字符串拼接函数实现)
 - 2025-05-11 这几个动态数组函数,简单又高效(动态数组的方法)
 - 2025-05-11 数据格式的转换方法,HSTACK函数重建数组
 - 2025-05-11 如何零基础学习VBA——数组函数介绍
 - 2025-05-11 新增工作表数据自动汇总到总表怎么弄?会用vstack函数轻松搞定!
 - 2025-05-11 字符拆分与合并,学会套路很简单(字符怎么合并)
 - 2025-05-11 六十六、Leetcode数组系列(中篇)(leetcode数组汇总)
 
欢迎 你 发表评论:
- 最近发表
 
- 标签列表
 - 
- java反编译工具 (77)
 - java反射 (57)
 - java接口 (61)
 - java随机数 (63)
 - java7下载 (59)
 - java数据结构 (61)
 - java 三目运算符 (65)
 - java对象转map (63)
 - Java继承 (69)
 - java字符串替换 (60)
 - 快速排序java (59)
 - java并发编程 (58)
 - java api文档 (60)
 - centos安装java (57)
 - java调用webservice接口 (61)
 - java深拷贝 (61)
 - 工厂模式java (59)
 - java代理模式 (59)
 - java.lang (57)
 - java连接mysql数据库 (67)
 - java重载 (68)
 - java 循环语句 (66)
 - java反序列化 (58)
 - java时间函数 (60)
 - java是值传递还是引用传递 (62)
 
 

本文暂时没有评论,来添加一个吧(●'◡'●)