news 2026/6/30 14:35:12

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

作者头像

张小明

前端开发工程师

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/29 5:47:02

SumatraPDF:让你的文档阅读体验飞起来

还在为打开PDF文件时软件卡顿而烦恼吗&#xff1f;是否曾经因为电子书阅读器功能臃肿而头疼&#xff1f;今天&#xff0c;让我为你介绍一款能让文档阅读变得轻松愉悦的神器——SumatraPDF&#xff01; 【免费下载链接】sumatrapdf SumatraPDF reader 项目地址: https://gitco…

作者头像 李华
网站建设 2026/6/29 4:41:04

Hackintool终极指南:5步搞定黑苹果系统完美配置

Hackintool是黑苹果社区中最受欢迎的图形化配置工具&#xff0c;被誉为"黑苹果全能工具"。它能够帮助用户轻松解决显卡驱动、音频输出、USB识别等核心兼容性问题&#xff0c;让复杂的配置文件编辑变得简单直观。本教程将从零开始&#xff0c;带你掌握这个强大工具的核…

作者头像 李华
网站建设 2026/6/30 4:47:47

Transformer注意力机制如何提升Qwen-Image-Edit-2509编辑精度

Transformer注意力机制如何提升Qwen-Image-Edit-2509编辑精度 在电商运营人员每天面对成百上千张商品图需要更新的今天&#xff0c;一个常见的场景是&#xff1a;某款T恤的颜色变了&#xff0c;但拍摄背景和模特姿势不变。传统做法是重新拍摄或打开Photoshop手动换色——耗时、…

作者头像 李华
网站建设 2026/6/29 12:34:21

抖音视频批量下载神器使用完整教程

抖音视频批量下载神器使用完整教程 【免费下载链接】douyinhelper 抖音批量下载助手 项目地址: https://gitcode.com/gh_mirrors/do/douyinhelper 还在为手动保存抖音视频而烦恼吗&#xff1f;想要高效收集喜欢的创作者内容却不知从何下手&#xff1f;抖音批量下载助手正…

作者头像 李华
网站建设 2026/6/28 21:03:27

如何用浏览器快速调试串口设备:Web串口助手的完整使用指南

如何用浏览器快速调试串口设备&#xff1a;Web串口助手的完整使用指南 【免费下载链接】SerialAssistant A serial port assistant that can be used directly in the browser. 项目地址: https://gitcode.com/gh_mirrors/se/SerialAssistant 在物联网开发和嵌入式系统调…

作者头像 李华
网站建设 2026/6/26 0:23:16

大模型微调--Dora微调

https://arxiv.org/pdf/2402.09353 DoRA: Weight-Decomposed Low-Rank AdaptationDoRA: Weight-Decomposed Low-Rank Adaptation DoRA&#xff08;Weight-Decomposed Low-Rank Adaptation&#xff09;是一种用于大模型微调的高效参数优化方法&#xff0c;通过分解权重矩阵并结合…

作者头像 李华