文章目录

  • 思想
  • 核心算法
  • 头文件
  • 递归调用
  • 非递归调用

思想

归并排序,是一种递归思想的排序方法,
2路归并指把两个有序序列组合为一个有序序列,
若初始序列无序,则看作是长度为1的多个有序序列,
把一个无序序列排序为有序序列的2路归并步骤如下:
1.设最小有序序列的长度为L,并设置初始L=1;
2.把整个序列分为若干组,每组长度为L;
3.使相邻的两个组归并为一个组,此时有序长度L为之前的两倍;
4.重复2-3步,直到L不小于待排序列的总长度.

核心算法

归并排序需要使用一个与原序列相同大小的辅助空间,用于存储归并后的序列.

// 2路归并排序,
// 输入:待排序列,序列1尺寸,序列2尺寸
// 输出:2路归并后的序列
void merge_2to1(int array[],int array_out[], int size1,int size2)
{int* in1 = array;int* in2 = &(array[size1]);int i = 0, j = 0,k=0;while (k < size1 + size2){if (i == size1){array_out[k] = in2[j];j++;k++;continue;}else if (j == size2){array_out[k] = in1[i];i++;k++;continue;}if (in1[i] <= in2[j]){array_out[k] = in1[i];i++;k++;}else{array_out[k] = in2[j];j++;k++;}}
}

头文件

#include "stdlib.h"
#include "string.h"

递归调用

分组函数把待排序列居中分为两个子序列,通过递归的方式保证子序列有序,然后执行2路归并.

// 归并排序,递归分组
void merge_sort_self(int array[], int array_out[], int size)
{int cut_index;if (size > 1){cut_index = size / 2;merge_sort_self(array, array_out, cut_index);merge_sort_self(&(array[cut_index]), &(array_out[cut_index]), size - cut_index);merge_2to1(array, array_out, cut_index, size - cut_index);memcpy(array, array_out, sizeof(int) * size);}
}

主函数主要申请一个与原序列相同大小的辅助空间,然后调用分组函数.


// 归并排序,递归调用
void merge_sort(int array[], int size)
{int* array_out = calloc(size, sizeof(int));if (size > 0){merge_sort_self(array, array_out, size);}free(array_out);
}

非递归调用

分组函数根据指定的分组大小把待排序列分为若干组,并假设每组数据都是有序的,然后对相邻组执行2路归并.

// 把序列分为若干组,两两归并
void merge_sort_group(int array[], int array_out[], int size, int group_size)
{int group_num = size / group_size;// 如果组数为奇数,先处理末尾if (group_num & 1){// 和之后有不足sroup_size 的部分归并merge_2to1(&array[(group_num - 1) * group_size],&array_out[(group_num - 1) * group_size],group_size, size % group_size);group_num--;}else if (size % group_size){// 剩余部分直接复制到输出merge_2to1(&array[(group_num) * group_size],&array_out[(group_num) * group_size],size % group_size,0 );}for (int i = 0; i < group_num;i+=2){merge_2to1(&array[i * group_size], &array_out[i * group_size],group_size, group_size);}
}

主函数首先申请一个与待排序列相同大小的辅助空间,然后从1开始设置组的长度,调用分组函数.

// 归并排序,非递归调用
void merge_sort_non(int array[], int size)
{int* array_out = calloc(size, sizeof(int));int* out=array_out, * in=array,*temp;for (int i = 1; i < size; i *= 2){merge_sort_group(in, out, size, i);temp = in;in = out;out = temp;}if (in != array)memcpy(array, in, sizeof(int) * size);free(array_out);
}

【C语言算法】归并排序相关推荐

  1. aes算法实现c语言_以C语言实现归并排序为例,谈谈五大常用算法之一的“分治法”...

    分治算法,顾名思义就是"分而治之",即把规模较大的复杂问题拆分为若干规模较小的类似子问题,并逐个解决,最后再将各个子问题的解决结果合并,得到原始问题的结果的方法.这个技巧是很多高效 ...

  2. c语言归并排序代码详细注释,C语言实现归并排序算法

    C语言实现归并排序算法 归并排序是创建在归并操作上的一种有效的排序算法.下面小编为大家整理了C语言实现归并排序算法,希望能帮到大家! 归并排序(Merge sort)是创建在归并操作上的一种有效的排序 ...

  3. 算法与数据结构c语言版PPT,C语言算法与数据结构.ppt

    C语言算法与数据结构.ppt 第十二章 算法与数据结构12.1 算法的基本概念,该节知识点所占试题比重为12,属于重点考查对象,基本上每次必考,主要考查算法的定义和对算法复杂度的理解.历次试题分值在0 ...

  4. C语言实现归并排序——2路归并排序

    C语言实现归并排序 文章目录 C语言实现归并排序 2路归并排序算法 1.定义动态数组 2.初始化动态数组 3.归并操作 4.归并排序算法实现 项目完整代码 运行效果图 2路归并排序算法 1.定义动态数 ...

  5. java语言算法描述_六大java语言经典算法

    在程序员们进行编程的时候,对各种数据的处理是少不了的,java语言算法在这个时候就十分重要了.数据算法有很多种,也并不区分哪种计算机语言使用,但是有程序员们常用的java语言经典算法,下面就简单介绍一 ...

  6. 列举c语言的算法描述,C语言算法

    在 编程 纳入必修课的趋势下,程序设计或App设计已是大部分学生必须具备的能力.而数据结构及其算法更是用来培养程序设计逻辑的基础理论,也是有志从事IT行业人员既基础又核心的课程. 本书采用丰富的图例来 ...

  7. 讲解c语言算法的视频,c语言算法学习视频

    [教程介绍] c语言看着简单,但等你深入学习以后,你就会发现需要学习的知识很多很多. 对于程序设计,算法是特别重要的,极为核心的一个知识. 在我们这部C语言算法教程,讲解的知识点极多,主要内容包括基本 ...

  8. c语言单片机求最小公倍数,单片机常用的14个C语言算法,要熟记在心哦!

    原标题:单片机常用的14个C语言算法,要熟记在心哦! 算法(Algorithm):计算机解题的基本思想方法和步骤. 算法的描述:是对要解决一个问题或要完成一项任务所采取的方法和步骤的描述,包括需要什么 ...

  9. 易语言html规则分析,易语言算法原理浅析【一】(示例代码)

    注: 如果你看完了下面的文章.就来试试这个KeyGenMe吧,相信你能有所收获. 一.文章开头首先我们要贴上一段易语言代码,并且编译这段代码,从汇编角度分析易语言程序编译后,易语言算法在汇编中的实现过 ...

最新文章

  1. iOS子构建Debug运行正常Release运行失败,提示证书问题
  2. Python学习笔记之五:类定义
  3. 企业信息管理计算机考什么,考信息系统运行管理员要学什么?
  4. 排错“未能封送类型,因为嵌入数组实例的长度与布局中声明的长度不匹配”...
  5. asp.net 初步入门使用正则抓取网页信息
  6. 报告分享】2020年汽车行业直播研究报告.pdf(附下载链接)
  7. Kalman Filter—Extended Kalman Filter(EKF)
  8. paip.提升用户体验---搜索功能设计
  9. 手机哪个软件可以远程控制服务器,手机远程有什么功能?手机远程协助软件哪个好?...
  10. 77GHz毫米波雷达快速chirp信号技术(三):测角原理
  11. 生猪价格matlab,2447教务处.doc
  12. QQ开始对每日添加好友人数作出限制(转)
  13. 钱币组合问题(动态规划)
  14. Tensorflow模型持久化与恢复
  15. 【深度学习】利用深度学习监控女朋友的微信聊天?
  16. 使用ThreeJs从零开始构建3D智能仓库——第五章(添加货架、货物与侧边栏)
  17. 谷歌小语种外链代发,谷歌外链购买平台哪个好?
  18. 软件工程--沃尔沃物流信息系统tp5实现源码
  19. 埋头工作就能触及 “ 宇宙真理 ”
  20. 爱莫科技加入中国ECR委员会助力FMCG产业更好更快发展

热门文章

  1. 二维平面最短距离(分治)
  2. 邻居好说话:冒泡排序
  3. Xshell连接云服务器并连接宝塔面板(天翼云为例)
  4. webpack基本使用
  5. 在CSDN设置“关注博主即可阅读全文”方法增加粉丝量超简单
  6. python的数据与matlab互通:SciPy
  7. 一、Oracle数据库
  8. UG\NX二次开发 菜鸟欢乐多
  9. 17.Rust中函数式语言功能:迭代器与闭包
  10. jQuery酷炫的文字动画效果代码