排序算法之归并排序

归并排序的核心思想是将需要排序的数据(通常是数组),切分成不同的小段,对每一段数据先在内部排序,然后将各个段再进行合并排序,比如给定一个数组2,1,4,3,可以先将数组切分成两个小数组也就是2,14,3,然后分别对两个小数组进行内部排序,也就是排成1,23,4,然后再对这两个小数组进行合并排序,在对这两个小数组合并排序的时候,我们按照这个步骤来操作:

  1. 新建一个数组,长度是总数组的长度,也就是4,我们记这个数组为help

  2. 分别有两个指针P1和P2指向两个小数组的第一个元素,然后移动两个指针,哪个数组对应的指针所指的数据小,就将它拷贝到help当中,如果有一个指针先移动结束,那么另一个数组当前指针所指的位置以及后面的数据直接拷贝到help即可

  3. 将help数组的数据还原到原数组中

代码实现:

复制代码
private void mergeSort(int[] arr, int start, int end) {
        if (start == end) {
            return;
        }
        int middle = start + ((end - start) >> 1);
        mergeSort(arr, start, middle);
        mergeSort(arr, middle + 1, end);
        merge(arr, start, middle, end);
    }

    private void merge(int[] arr, int start, int middle, int end) {
        System.err.println(start + ":" + middle + ":" + end);
        int i = 0;
        int[] help = new int[end - start + 1];
        int index1 = start;
        int index2 = middle + 1;
        while (index1 <= middle && index2 <= end) {
            help[i++] = arr[index1] <= arr[index2] ? arr[index1++] : arr[index2++];
        }
        while (index1 <= middle) {
            help[i++] = arr[index1++];
        }
        while (index2 <= end) {
            help[i++] = arr[index2++];
        }
        int length = help.length;
        for (int i1 = 0; i1 < length; i1++) {
            arr[start + i1] = help[i1];
        }
    }

    @Test
    public void mergeSort() {
        int[] array = new int[]{3, 2, 5, 4};
        int length = array.length;
        mergeSort(array, 0, length - 1);
    }
相关推荐
智码看视界4 分钟前
Day 56:AI辅助开发全面提效:Copilot + Cursor的Java开发
java·单元测试·copilot·cursor·后端开发·代码审查·ai辅助开发
晚风醉蝶7 分钟前
1-16-计数排序-CountingSort
python·算法·排序算法
疯狂打码的少年13 分钟前
【数据结构】排序算法:归并排序与基数排序
数据结构·笔记·算法·排序算法
asdfg125896317 分钟前
一个例子理解Java中的函数式接口
java·函数式接口
toolsmith21 分钟前
一个商业软件的License校验,居然把验签的证书放在了License文件里
java
wuminyu23 分钟前
JDK21 FFM异步读取MSG_ZEROCOPY错误队列揭秘
java·linux·c语言·jvm·c++
存在morning29 分钟前
【PySpark 学习笔记 三】DataFrame API 入门
android·java·数据库
AC赳赳老秦31 分钟前
企业标签体系搭建:基于 OpenClaw 采集的多维度公开数据,构建企业画像标签库
java·运维·服务器·python·信息可视化·deepseek·openclaw
智嵌研习社35 分钟前
Ollama 本地大模型完全配置指南:Modelfile 参数与系统环境变量深度解析
java·开发语言
吃旺旺雪饼的小男孩40 分钟前
U-Net 语义分割详解:原论文、PyTorch 实现与真实消融实
人工智能·pytorch·python·算法