排序算法之归并排序

归并排序

简介

归并排序是一种分治思想的排序算法,它的基本思想是将待排序的数组分成若干个子序列,每个子序列都是有序的,然后再将子序列合并成一个有序的数组。

算法解析

归并排序的核心思想就是分治,将数组无限拆分到最小数组,然后在进行排序。也就是:使用递归拆分成N 个数组,拆分到不可在拆分是,对数组进行排序,这时候都是有序数组,在进行合并。

代码实现

java 复制代码
**
 * 归并排序
 */
public class MergeSort {

    public static void sort(int[] arr){
        mergeSort(arr, 0, (arr.length - 1));
    }


    public static void mergeSort(int[] arr, int left, int right){
        if (left < right){
            int mid = (right + left) / 2;
            mergeSort(arr, left, mid);
            mergeSort(arr, mid + 1, right);
            mergeData(arr, left, right, mid);
        }
    }

    /**
     * 归并数据
     * @param arr
     * @param left
     * @param right
     * @param mid
     */
    public static void mergeData(int[] arr, int left, int right, int mid){
        int[] temp = new int[(right - left +1)];
        int leftNum = (mid - left) + 1;
        int rightNum = (right - mid);
        System.arraycopy(arr, left, temp, 0, leftNum);
        System.arraycopy(arr, mid + 1, temp, leftNum, rightNum);

        int l = 0;
        int r = leftNum;
        int k = left;
        // 比较并将数据放回原始数组
        while (l < leftNum && r < temp.length){
            if (temp[l] < temp[r]){
                arr[k] = temp[l];
                l++;
            }else {
                arr[k] = temp[r];
                r++;
            }
            k++;
        }

        // 将剩下数据放回原始数组
        while (l < leftNum){
            arr[k] = temp[l];
            l++;
            k++;
        }
        while (r < temp.length){
            arr[k] = temp[r];
            r++;
            k++;
        }

    }

    public static void main(String[] args) {
        int[] arr = { 10, 7, 3, 3, 4, 2, 8, 1, 5, 9, 2, 1};
        sort(arr);
        System.out.println("arr:"+ JSON.toJSONString(arr));

    }
}

注意事项

归并排序的时间复杂度为O(nlogn),它的性能比冒泡排序和插入排序要好得多,特别是在大型列表上

相关推荐
卡尔特斯2 小时前
Android Kotlin 项目代理配置【详细步骤(可选)】
android·java·kotlin
白鲸开源2 小时前
Ubuntu 22 下 DolphinScheduler 3.x 伪集群部署实录
java·ubuntu·开源
ytadpole2 小时前
Java 25 新特性 更简洁、更高效、更现代
java·后端
纪莫2 小时前
A公司一面:类加载的过程是怎么样的? 双亲委派的优点和缺点? 产生fullGC的情况有哪些? spring的动态代理有哪些?区别是什么? 如何排查CPU使用率过高?
java·java面试⑧股
JavaGuide3 小时前
JDK 25(长期支持版) 发布,新特性解读!
java·后端
用户3721574261353 小时前
Java 轻松批量替换 Word 文档文字内容
java
白鲸开源3 小时前
教你数分钟内创建并运行一个 DolphinScheduler Workflow!
java
CoovallyAIHub4 小时前
中科大DSAI Lab团队多篇论文入选ICCV 2025,推动三维视觉与泛化感知技术突破
深度学习·算法·计算机视觉
Java中文社群4 小时前
有点意思!Java8后最有用新特性排行榜!
java·后端·面试
代码匠心4 小时前
从零开始学Flink:数据源
java·大数据·后端·flink