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

归并排序速记

归并排序(Merge Sort)其基本思想是将数组分成若干个子数组,分别对每个子数组进行排序,然后再将这些子数组合并成一个完整的、有序的数组。归并排序的主要优点是其稳定性(即相等元素的相对顺序在排序前后不会改变)和高效性(时间复杂度为O(n log n))。

下面是归并排序的详细步骤:

  1. 分解:将数组从中间分成两个子数组,如果数组长度为奇数,则其中一个子数组会多一个元素。
  2. 递归排序:对这两个子数组分别进行归并排序。
  3. 合并:将两个已排序的子数组合并成一个完整的、有序的数组。

private static void mergeSort(int[] arr, int left, int right) {
    if (left >= right) {
        return;
    }
    int middle = (left + right) >>> 1;
    mergeSort(arr, left, middle);
    mergeSort(arr, middle + 1, right);
    //每个小组走完左边和右边就就行排序,比如(0,1)走完(0,0)和(1,1),就会走 merge(arr, 0, 0, 1);
    merge(arr, left, middle, right);
}
/**
 * 合并数组-不是递归
 *
 * @param arr
 * @param left
 * @param middle
 * @param right
 */
private static void merge(int[] arr, int left, int middle, int right) {
    int s1 = left;
    int s2 = middle + 1;
    int location = 0;
    int[] temArr = new int[right - left + 1];

    while (s1 <= middle && s2 <= right) {
        if (arr[s1] < arr[s2]) {
            temArr[location] = arr[s1];
            s1++;
        } else {
            temArr[location] = arr[s2];
            s2++;
        }
        location++;
    }

    while (s1 <= middle) {
        temArr[location] = arr[s1];
        s1++;
        location++;
    }
    while (s2 <= right) {
        temArr[location] = arr[s2];
        s2++;
        location++;
    }


    for (int i = 0; i < temArr.length; i++) {
        arr[left + i] = temArr[i];
    }
}

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

相关文章:

  • 阐述对鸿蒙生态的认知和了解,并对鸿蒙生态的崛起进行简要分析
  • 公众号黑名单(资源类)仅个人备份,便于查看
  • 半参数模型
  • AnaTraf | 网络性能监测系统与分布式性能监测探秘
  • 省级-建成区绿化覆盖率数据(2006-2022年)
  • Effective C++ 学习笔记二
  • python 数据结构 2
  • 【云原生】云原生后端:数据管理
  • 设计卷积神经网络CNN为什么不是编程?
  • NFT Insider #153:The Sandbox 推出 Biggie 奇妙宇宙体验,ApeChain 推出顶级交易员游戏
  • 达梦数据库-同义词简介
  • 软考:大数据架构设计
  • 【多态】析构函数的重写
  • 七、MapReduce 编程模型:原理、流程与应用场景
  • 数据结构+算法分析与设计[22-24年真题版]
  • Apache Dubbo (RPC框架)
  • 计算机毕业设计Hadoop+大模型旅游推荐系统 旅游景点推荐 旅游可视化 旅游爬虫 景区客流量预测 旅游大数据 大数据毕业设计
  • 算法深度剖析:前缀和
  • 二、Go快速入门之数据类型
  • 【Kaggle | Pandas】练习6:重命名和组合
  • STM32G4 双ADC模式之常规同步模式独立注入模式
  • 《使用Gin框架构建分布式应用》阅读笔记:p307-p392
  • 淘宝商品描述,一键“爬”回家 —— Java爬虫的奇妙冒险
  • [论文阅读]Generalizable Humanoid Manipulation with Improved 3D Diffusion Policies
  • C#调用webService接口
  • Java日志脱敏——基于logback MessageConverter实现