news 2026/6/10 17:28:04

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

作者头像

张小明

前端开发工程师

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/6/10 2:03:01

为什么现代Java开发必须掌握Reactor Core响应式编程?

在当今高并发、大数据处理的Java应用开发中&#xff0c;Reactor Core作为JVM平台上的非阻塞响应式编程基础库&#xff0c;正成为提升系统性能的关键技术。响应式编程不仅仅是技术栈的更新&#xff0c;更是开发思维方式的变革&#xff0c;它让开发者能够构建出真正响应式的应用程…

作者头像 李华
网站建设 2026/6/10 15:50:49

Blender贝塞尔曲线终极解决方案:从入门到精通的完整工作流指南

还在为Blender中复杂的贝塞尔曲线编辑而烦恼吗&#xff1f;传统的曲线工具操作繁琐&#xff0c;控制点难以精准调整&#xff0c;让创意表达处处受限。Blender Bezier Utilities插件的出现&#xff0c;彻底改变了这一现状&#xff0c;让贝塞尔曲线编辑变得前所未有的简单高效。 …

作者头像 李华
网站建设 2026/6/10 15:47:51

百度网盘提取码智能助手:如何一键获取分享码的完整指南

百度网盘提取码智能助手&#xff1a;如何一键获取分享码的完整指南 【免费下载链接】baidupankey 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 还在为百度网盘提取码而反复切换页面吗&#xff1f;BaiduPanKey是一款开源智能工具&#xff0c;能够自动从分…

作者头像 李华
网站建设 2026/6/10 2:05:35

音乐格式转换新思路:三步告别加密音频的束缚

音乐格式转换新思路&#xff1a;三步告别加密音频的束缚 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库&#xff1a; 1. https://github.com/unlock-music/unlock-music &#xff1b;2. https://git.unlock-music.dev/um/web 项目地址: https://gitcod…

作者头像 李华
网站建设 2026/6/10 15:52:42

使用PyTorch微调Seed-Coder-8B-Base适配私有代码库

使用PyTorch微调Seed-Coder-8B-Base适配私有代码库 在现代软件研发体系中&#xff0c;一个日益突出的矛盾逐渐浮现&#xff1a;通用大模型虽然具备强大的代码生成能力&#xff0c;却难以真正“理解”企业内部特有的技术语境。你有没有遇到过这样的场景&#xff1f;——Copilot…

作者头像 李华
网站建设 2026/6/10 15:55:14

Wan2.2-T2V-5B模型在JLink驱动调试可视化中的创新应用

Wan2.2-T2V-5B模型在JLink驱动调试可视化中的创新应用 在嵌入式系统开发中&#xff0c;一个看似简单的LED闪烁程序也可能隐藏着复杂的时序问题。开发者面对满屏的日志输出&#xff1a;“0.45s: entering sleep mode”&#xff0c;“1.87s: EXTI interrupt triggered”&#xff…

作者头像 李华