news 2026/4/13 4:28:25

归并排序算法基础详细讲解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
归并排序算法基础详细讲解

归并排序定义:

最开始的每个元素单独作为一个子序列,每轮对相邻的子序列两两归并直到归并成一个序列//归并排序的核心思想是将一个大问题分解成若干个小问题,分别解决这些小问题,然后将结果合并起来,最终得到整个问题的解。

1.归并排序的步骤如下:

  1. 分解(Divide):将待排序的数组分成两个子数组,每个子数组包含大约一半的元素。(分成2份)
  2. 解决(Conquer):递归or循环每个子数组进行排序。
  3. 合并(Combine):将两个已排序的子数组合并成一个有序的数组。

2. 算法步骤

  1. 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列;

  2. 设定两个指针,最初位置分别为两个已经排序序列的起始位置;

  3. 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置;

  4. 重复步骤 3 直到某一指针达到序列尾;

  5. 将另一序列剩下的所有元素直接复制到合并序列尾。

第一步:我们需要用一个递归函数来将我们的左边部分和右边部分,分别将每个子序列给拆分为一个元素,(这个可能会有点绕,我们直到递归函数要有终止条件才会跳出循环)

void merge_sort(int arr[], int left, int right) { if (left < right) { int mid = left + (right - left) / 2; merge_sort(arr, left, mid); //这个就是递归的左边的子序列 merge_sort(arr, mid + 1, right); //这个是递归的右边的子序列 merge(arr, left, mid, right); } }

里面的merge函数会持续循环调用,单单元素合并,两两元素合并,最后合并2个有序子序列;

下面就是核心 merge核心排序代码

// 简洁版归并排序实现 void merge(int arr[], int left, int mid, int right) {//第一次传的参数是arr,0,0,1就是单独第一个元素嘛,第二次就是 第二个元素和第三个合并, int n1 = mid - left + 1; int n2 = right - mid; // 动态分配临时数组 int* L = (int*)malloc(n1 * sizeof(int)); int* R = (int*)malloc(n2 * sizeof(int)); // 将数据拷贝进去 for (int i = 0; i < n1; i++) L[i] = arr[left + i]; for (int j = 0; j < n2; j++) R[j] = arr[mid + 1 + j]; // 合并 int i = 0, j = 0, k = left; while (i < n1 && j < n2) { if (L[i] <= R[j]) { arr[k++] = L[i++]; //比较大小合并 } else { arr[k++] = R[j++]; } } // 拷贝剩余元素 while (i < n1) arr[k++] = L[i++]; while (j < n2) arr[k++] = R[j++]; // 释放内存 free(L); free(R); }

最后就是我们的主函数啦!要测试和调试嘛,在周中学习讲到可能不太精细,周末会提高作品质量,本周末的实战小项目(通讯录管理链表存储)

int main() { int arr[] = {5, 89, 56, 21, 3, 1, 56}; //用于测试我们的代码和调试嘛 int n = sizeof(arr) / sizeof(arr[0]); printf("排序前: "); for (int i = 0; i < n; i++) printf("%d ", arr[i]); printf("\n"); merge_sort(arr, 0, n - 1); printf("排序后: "); for (int i = 0; i < n; i++) printf("%d ", arr[i]); printf("\n"); return 0; }

不要忘记!!!malloc函数要引入头文件<stdlib.h>

谢谢大家的观看和学习,有哪些疑问?我们可以相互讨论学习希望我们学者也可以相互学习有一个平台可以帮助大学里面学习的基础c语言免费回答感谢感谢!!!QQ群号:238038904

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/9 7:24:11

当日总结(2025年12月15日)

当日总结&#xff08;2025年12月15日&#xff09; 前言 去做&#xff0c;去试错&#xff0c;去迭代。 二叉树专题 总结二叉树 v0.1

作者头像 李华
网站建设 2026/4/12 18:43:38

终极指南:MouseClick自动连点器如何让工作效率翻倍

终极指南&#xff1a;MouseClick自动连点器如何让工作效率翻倍 【免费下载链接】MouseClick &#x1f5b1;️ MouseClick &#x1f5b1;️ 是一款功能强大的鼠标连点器和管理工具&#xff0c;采用 QT Widget 开发 &#xff0c;具备跨平台兼容性 。软件界面美观 &#xff0c;操作…

作者头像 李华
网站建设 2026/4/11 15:27:22

WinDirStat:终极Windows磁盘空间分析与清理完全指南

WinDirStat&#xff1a;终极Windows磁盘空间分析与清理完全指南 【免费下载链接】windirstat WinDirStat is a disk usage statistics viewer and cleanup tool for various versions of Microsoft Windows. 项目地址: https://gitcode.com/gh_mirrors/wi/windirstat 还…

作者头像 李华
网站建设 2026/4/13 10:28:04

GitHub Actions自动化流水线中集成Seed-Coder-8B-Base进行代码审查

GitHub Actions自动化流水线中集成Seed-Coder-8B-Base进行代码审查 在现代软件开发实践中&#xff0c;一个 Pull Request 提交后等待数小时才收到人工 Code Review 反馈&#xff0c;几乎是每个工程师都经历过的“痛点”。更令人担忧的是&#xff0c;即便经过评审&#xff0c;一…

作者头像 李华
网站建设 2026/4/11 7:52:05

Miniconda预装工具链解析:pip、setuptools、virtualenv全掌握

Miniconda预装工具链解析&#xff1a;pip、setuptools、virtualenv全掌握 在人工智能项目开发中&#xff0c;一个常见的场景是&#xff1a;你从GitHub克隆了一个热门的深度学习模型仓库&#xff0c;按照README执行pip install -r requirements.txt&#xff0c;结果报错——某些…

作者头像 李华
网站建设 2026/4/11 11:05:44

清华源 vs 官方HuggingFace:哪个更快下载gpt-oss-20b?

清华源 vs 官方HuggingFace&#xff1a;哪个更快下载gpt-oss-20b&#xff1f; 在大模型时代&#xff0c;开发者最熟悉的等待不是训练收敛&#xff0c;而是“还在下载 pytorch_model.bin”。尤其是在国内环境下从 Hugging Face 拉取一个十几GB的模型&#xff0c;那种每秒几MB、动…

作者头像 李华