news 2026/5/9 0:56:06

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

作者头像

张小明

前端开发工程师

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/28 23:00:10

Mobile Select:颠覆传统移动端选择体验的企业级解决方案

Mobile Select&#xff1a;颠覆传统移动端选择体验的企业级解决方案 【免费下载链接】mobile-select mobile-select: 是一个多功能的移动端滚动选择器&#xff0c;支持单选到多选&#xff0c;多级级联&#xff0c;提供回调函数和异步数据更新。 项目地址: https://gitcode.co…

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

虚拟机性能优化实战:万字详解提升运行效率与解决卡顿问题

引言&#xff1a;虚拟机性能优化的重要性 在当今的云计算、开发测试和企业IT环境中&#xff0c;虚拟机已成为基础设施的核心组成部分。然而&#xff0c;虚拟机性能问题——特别是卡顿、响应迟缓、资源争用等——仍然是许多用户面临的挑战。有效的虚拟机性能优化不仅能提升工作…

作者头像 李华
网站建设 2026/5/6 0:01:35

VirtualMonitor虚拟显示器实战指南:打造高效多屏工作环境

VirtualMonitor虚拟显示器实战指南&#xff1a;打造高效多屏工作环境 【免费下载链接】VirtualMonitor 项目地址: https://gitcode.com/gh_mirrors/vi/VirtualMonitor 还在为有限的屏幕空间而困扰吗&#xff1f;每天在多个应用间频繁切换&#xff0c;不仅降低工作效率&…

作者头像 李华
网站建设 2026/4/26 11:39:38

3步搞定Vue项目Office文件预览:新手也能快速上手的实用指南

3步搞定Vue项目Office文件预览&#xff1a;新手也能快速上手的实用指南 【免费下载链接】vue-office 项目地址: https://gitcode.com/gh_mirrors/vu/vue-office 还在为Vue项目中预览Word、Excel和PDF文件而烦恼吗&#xff1f;Vue-Office为你提供了一套完整的解决方案&a…

作者头像 李华
网站建设 2026/4/30 15:58:37

GitHub Projects管理Qwen-Image-Edit-2509功能开发路线图

Qwen-Image-Edit-2509&#xff1a;当自然语言成为图像编辑的“新画笔” 在电商大促季&#xff0c;运营团队常常面临一个令人头疼的问题&#xff1a;成千上万张商品图需要统一更换促销标语、调整价格标签、替换品牌LOGO。过去&#xff0c;这得靠设计师一张张打开Photoshop手动修…

作者头像 李华
网站建设 2026/5/4 6:05:45

Static 关键字笔记

在 Java 编程中&#xff0c;static关键字是基础且高频的考点&#xff0c;其涉及的类加载机制、代码执行顺序等内容&#xff0c;直接影响我们对程序运行逻辑的判断。本文结合实操案例&#xff0c;拆解static关键字的核心特性与执行规则。一、static核心执行规则static修饰的内容…

作者头像 李华