每天学习一个小算法:归并排序

归并排序


算法原理

归并排序是基于分治法的经典排序算法:

  1. 拆分:把数组从中间分成两半,递归拆分直到每个区间只有一个元素。
  2. 合并:将两个有序子区间合并成一个更大的有序区间。
  3. 最终整个数组变为有序。

一、适用场景

  • 大数据量排序,性能稳定且始终为 O(n log n)
  • 追求稳定排序的场景
  • 外部排序(数据无法全部载入内存)
  • 链表排序(最高效)
  • 不适合内存极小的嵌入式场景(空间消耗 O(n))

二、复杂度分析

1.时间复杂度

  • 最好时间复杂度:O(n log n)
  • 平均时间复杂度:O(n log n)
  • 最坏时间复杂度:O(n log n)

2.空间复杂度

空间复杂度:O(n)(需要临时数组)

三、代码实现

1、Python实现

python 复制代码
# 归并排序 Python 实现
def merge(arr, left, mid, right):
    temp = []
    i = left
    j = mid + 1
    while i <= mid and j <= right:
        if arr[i] <= arr[j]:
            temp.append(arr[i])
            i += 1
        else:
            temp.append(arr[j])
            j += 1
    temp += arr[i:mid+1]
    temp += arr[j:right+1]
    arr[left:right+1] = temp

def merge_sort(arr, left, right):
    if left < right:
        mid = (left + right) // 2
        merge_sort(arr, left, mid)
        merge_sort(arr, mid + 1, right)
        merge(arr, left, mid, right)
    return arr

2、Java实现

java 复制代码
// 归并排序 Java 实现
public static void merge(int[] arr, int left, int mid, int right) {
    int[] temp = new int[right - left + 1];
    int i = left, j = mid + 1, k = 0;
    while (i <= mid && j <= right) {
        if (arr[i] <= arr[j]) temp[k++] = arr[i++];
        else temp[k++] = arr[j++];
    }
    while (i <= mid) temp[k++] = arr[i++];
    while (j <= right) temp[k++] = arr[j++];
    for (i = left, k = 0; i <= right; i++, k++) arr[i] = temp[k];
}

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

3、C语言实现

c 复制代码
// 归并排序 C 语言实现
void merge(int arr[], int left, int mid, int right) {
    int i = left, j = mid + 1, k = 0;
    int temp[right - left + 1];
    while (i <= mid && j <= right) {
        if (arr[i] <= arr[j]) temp[k++] = arr[i++];
        else temp[k++] = arr[j++];
    }
    while (i <= mid) temp[k++] = arr[i++];
    while (j <= right) temp[k++] = arr[j++];
    for (i = left, k = 0; i <= right; i++, k++) arr[i] = temp[k];
}

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

总结

记录自己的快乐学习日志,也祝贺观看到这的小伙伴早日学有所成,财富自由💰💰。

记得点赞👍、收藏👋呀!!!

相关推荐
椰羊~王小美2 小时前
实践项目来串联概念(嵌入式、网络、后端、前端、AI)
学习
王老师青少年编程2 小时前
csp信奥赛C++高频考点专项训练之贪心算法 --【区间贪心】:区间覆盖(加强版)
c++·算法·贪心·csp·信奥赛·区间贪心·区间覆盖(加强版)
碧海银沙音频科技研究院2 小时前
杰理项目开发大全课程
人工智能·深度学习·算法
三品吉他手会点灯2 小时前
C语言学习笔记 - 15.C编程预备计算机专业知识 - CPU 内存条 硬盘 显卡 主板 显示器 之间的关系
c语言·笔记·学习
三品吉他手会点灯2 小时前
C语言学习笔记 - 11.C语言简介 - VSCode(C/C++)环境安装与配置
c语言·笔记·学习
风一样的航哥2 小时前
LeetCode 2615 等值距离和:前缀和优化O(n)解法深度解析
数据结构·算法·leetcode
生成论实验室2 小时前
生成态势猜想:一种统一的宇宙动力学语法
人工智能·科技·神经网络·算法·信息与通信
旖-旎3 小时前
深搜(二叉树的所有路径)(6)
c++·算法·leetcode·深度优先·递归
今天你TLE了吗3 小时前
LLM到Agent&RAG——AI知识点概述 第六章:Function Call函数调用
java·人工智能·学习·语言模型·大模型