归并排序,自顶向下

归并排序主要两步,一步是划分区间,另一步是合并两个区间

这个算法的稳定性更好,对比快排这种,如果整体是倒序的话,快排的复杂度会达到o(n^2),归并会更稳定。

划分区间主要是递归去实现,下面给出代码

java 复制代码
package com.codeking.sortTest;

/**
 * @author xiongjl
 * @since 2023/10/31  13:19
 */
public class sortTest {
    public static void main(String[] args) {
        int[] arr = {1, 2, 5, 4, 9, 8, 7};
        mergeSort(arr, new int[arr.length], 0, arr.length - 1);
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i]);
        }
    }

    // 归并排序
    static void mergeSort(int[] arr, int[] temp, int left, int right) {
        // 如果left和right相等,说明只有以一个元素
        if (left < right) {
            int mid = left + (right - left) / 2;
            // 处理左右区间
            mergeSort(arr, temp, left, mid);
            mergeSort(arr, temp, mid + 1, right);
            // 合并区间
            merge(arr, temp, left, mid, right);
        }
    }

    // 合并有序数组 [5,4,2,6]
    static void merge(int[] arr, int[] temp, int left, int mid, int right) {
        int leftPos = left, rightPos = mid + 1, pos = left;
        // 两边都有元素
        while (leftPos <= mid && rightPos <= right) {
            if (arr[leftPos] < arr[rightPos]) {
                temp[pos++] = arr[leftPos++];
            } else {
                temp[pos++] = arr[rightPos++];
            }
        }
        // 处理剩下的元素
        while (leftPos <= mid) {
            temp[pos++] = arr[leftPos++];
        }
        while (rightPos <= right) {
            temp[pos++] = arr[rightPos++];
        }
        // 覆盖原数组
        while (left <= right) {
            arr[left] = temp[left];
            left++;
        }
    }
}

有一个讲排序算法挺不错的up主,可以看看:排序算法:归并排序【图解+代码】_哔哩哔哩_bilibili

相关推荐
毕业设计制作和分享35 分钟前
springboot150基于springboot的贸易行业crm系统
java·vue.js·spring boot·后端·毕业设计·mybatis
电子_咸鱼3 小时前
LeetCode——Hot 100【电话号码的字母组合】
数据结构·算法·leetcode·链表·职场和发展·贪心算法·深度优先
仰泳的熊猫3 小时前
LeetCode:785. 判断二分图
数据结构·c++·算法·leetcode
rit84324994 小时前
基于MATLAB实现基于距离的离群点检测算法
人工智能·算法·matlab
my rainy days6 小时前
C++:友元
开发语言·c++·算法
haoly19896 小时前
数据结构和算法篇-归并排序的两个视角-迭代和递归
数据结构·算法·归并排序
微笑尅乐6 小时前
中点为根——力扣108.讲有序数组转换为二叉搜索树
算法·leetcode·职场和发展
小梁努力敲代码6 小时前
java数据结构--List的介绍
java·开发语言·数据结构
摸鱼的老谭6 小时前
构建Agent该选Python还是Java ?
java·python·agent
lang201509286 小时前
Spring Boot 官方文档精解:构建与依赖管理
java·spring boot·后端