归并算法实现

1.归并算法图解

2.归并算法代码

bash 复制代码
package com.suanfa.sort;

import java.util.Arrays;

/**
 * 归并算法
 */
public class MergeSort {

    /**
     * 拆的时间复杂度logn * 并的时间复杂度n = nlogn
     *
     * @param arr
     * @param left
     * @param right
     */
    public static void sortMerge(int[] arr, int left, int right) {
        //相等了就表示只有一个数了 不用再拆了
        if (left < right) {
            //取中间值进行拆分
            int mid = (left + right) / 2;
            //左边拆分(从右往左拆分),拆的过程的时间复杂度是logn(从右往左拆分)
            sortMerge(arr, left, mid);
            //右边拆分(从左往右拆分)
            sortMerge(arr, mid + 1, right);
            //这里合并值是从右边开始合并(因为这里是栈先执行后返回后执行的先返回),等栈回溯到最后一次时就相当于拆成两个一起合并了
            merge(arr, left, mid, right);
            System.out.println(Arrays.toString(arr));
        }
    }

    /**
     * 并的时间复杂度为n
     *
     * @param arr
     * @param left
     * @param mid
     * @param right
     */
    public static void merge(int[] arr, int left, int mid, int right) {
        //临时数组,用来存放合并的有序数据
        int[] temp = new int[arr.length];
        //分割左边的开始位置
        int point1 = left;
        //分割右边开始位置
        int point2 = mid + 1;
        //这里为什么是left,因为这里排序是从左边到右边结束,所以开始值是left
        int tempIndex = left;
        //将左边和右边合并,使用插入排序,终止条件时左边的开始位置到左边边界,右边到右边边界
        while (point1 <= mid && point2 <= right) {
            if (arr[point1] < arr[point2]) {
                temp[tempIndex] = arr[point1];
                point1++;
            } else {
                temp[tempIndex] = arr[point2];
                point2++;
            }
            tempIndex++;
        }
        //如果左边的位置小于或者等于左边的边界值,说明左边的值还有数据没有放入到临时数组中
        // 这里一般会有一个数据还没有放进去,因为最后一个数据是没有数据可比较了
        while (point1 <= mid) {
            temp[tempIndex] = arr[point1];
            point1++;
            tempIndex++;
        }
        //这里是放入右边还没有放入的数据
        while (point2 <= right) {
            temp[tempIndex] = arr[point2];
            point2++;
            tempIndex++;
        }
        //总结:这里左边和右边只可能有一边需要放入,因为最后剩一个数据要么是左边的要么是右边的

        //这里为什么是left开始right结束,以为排序是从left开始right结束的
        for (int i = left; i <= right; i++) {
            arr[i] = temp[i];
        }
    }

    public static void main(String[] args) {
        int arr[] = {9, 5, 6, 8, 0, 3, 7, 1};
        sortMerge(arr, 0, arr.length - 1);
    }
}
相关推荐
ZYJCSZKJ2 小时前
基于地理位置围栏的短视频POI团购系统:LBS空间索引与流量分发实践
java·服务器·数据库
mldong7 小时前
引擎从不发一条消息:jeeflow 的两类扩展点与消息模块的分工
java·架构
君顾18 小时前
智慧零售实战指南:从技术架构到落地方案全解析
java·开发语言·零售
北域码匠8 小时前
高通滤波算法深度解析(High-Pass Filter)
stm32·算法·c#·数字信号处理·嵌入式开发·滤波算法·高通滤波
zhanghe6878 小时前
es的密码带有特殊字符,导出
java
指掀涛澜天下惊8 小时前
强化学习进阶篇八 策略梯度算法
深度学习·学习·算法·强化学习
pnoker8 小时前
IoT DC3 概念解读:把设备抽象成一套语义模板——位号、指令、事件与面向智能体的设备建模
java·人工智能·物联网·iot·dc3
乌萨奇也要立志学C++8 小时前
【洛谷】kmp算法
开发语言·算法
my_realmy8 小时前
Java SE 基础学习笔记(一):面向对象、继承多态、抽象接口与异常(JDK 8)
java·多线程·并发··生产者消费者模式
禹凕9 小时前
Dijkstra算法详解与应用
python·算法