c语言递归方法排序,归并排序,递归法,C语言实现。

利用归并排序法对序列排序的示意图(递归法):

c语言递归方法排序,归并排序,递归法,C语言实现。_第1张图片

一、算法分析:利用递归的分治方法:1、将原序列细分,直到成为单个元素;2、在将分割后的序列一层一层地按顺序合并,完成排序。细分通过不断深入递归完成,合并通过递归   一层层返回完成。

二、C语言代码

1、完成排序的三个函数

void MergeSort(int l[],int lenght)

{

int tmp[lenght];

MSort(l,tmp,,lenght);

}

/*分:MSort将原来的序列不断细分,直到为1,再由Merge归并*/

void MSort(int l[],int tmp[],int left,int right)

{

int mid;

if(left!=right)

{

mid=(left+right)/; //将待排序序列分成两部分

MSort(l,tmp,left,mid); //将左边排序

MSort(l,tmp,mid+,right); //将右边排序

Merge(l,tmp,left,mid,right); //将已排序的两部分合并

}

}

/*数组tmp只是作为临时存储,归并后,再将有序的数组拷贝到原来的l中*/

void Merge(int l[],int tmp[],int left,int mid,int right)

{

int i,j,t;

for(i=left,j=mid+,t=left;i<=mid&&j<=right;t++)

{

if(l[i]<=l[j])

{

tmp[t]=l[i];

i++;

}

else

{

tmp[t]=l[j];

j++;

}

}

/*归并的两个序列不一样长时,将剩余的元素加入tmp*/

if(i<=mid)

{

for(;i<=mid;i++)

{

tmp[t]=l[i];

t++;

}

}

if(j<=right)

{

for(;j<=right;j++)

{

tmp[t]=l[j];

t++;

}

}

/*将归并后的有序序列拷贝到原数组*/

for(t=left;t<=right;t++)

{

l[t]=tmp[t];

}

}

使用时,调用MergeSort函数就行了

下面是我写的一个测试代码

#include

#include

#include

#define NUM 5000

void MergeSort(int l[],int length);

void MSort(int l[],int tmp[],int left,int right);

void Merge(int l[],int tmp[],int left,int mid,int right);

int main()

{

int i,a[NUM+];

srand((unsigned)time(NULL));

/*a[0]作为哨兵单元,不在随机数生成之列*/

for(i=;i<=NUM;i++)

{

a[i]=rand();

}

/*printf("Befor sort:");

for(i=1;i<=NUM;i++)

{

printf("%d ",a[i]);

}*/

MergeSort(a,NUM);

printf("\nAfter sort:");

for(i=;i<=NUM;i++)

{

printf("%d ",a[i]);

}

return ;

}

void MergeSort(int l[],int lenght)

{

int tmp[lenght];

MSort(l,tmp,,lenght);

}

/*分:MSort将原来的序列不断细分,直到为1,再由Merge归并*/

void MSort(int l[],int tmp[],int left,int right)

{

int mid;

if(left!=right)

{

mid=(left+right)/; //将待排序序列分成两部分

MSort(l,tmp,left,mid); //将左边排序

MSort(l,tmp,mid+,right); //将右边排序

Merge(l,tmp,left,mid,right); //将已排序的两部分合并

}

}

/*数组tmp只是作为临时存储,归并后,再将有序的数组拷贝到原来的l中*/

void Merge(int l[],int tmp[],int left,int mid,int right)

{

int i,j,t;

for(i=left,j=mid+,t=left;i<=mid&&j<=right;t++)

{

if(l[i]<=l[j])

{

tmp[t]=l[i];

i++;

}

else

{

tmp[t]=l[j];

j++;

}

}

/*归并的两个序列不一样长时,将剩余的元素加入tmp*/

if(i<=mid)

{

for(;i<=mid;i++)

{

tmp[t]=l[i];

t++;

}

}

if(j<=right)

{

for(;j<=right;j++)

{

tmp[t]=l[j];

t++;

}

}

/*将归并后的有序序列拷贝到原数组*/

for(t=left;t<=right;t++)

{

l[t]=tmp[t];

}

}

八皇后问题详细分析与解答(递归法解答,c#语言描述)

八皇后问题,是一个古老而著名的问题,是回溯算法的典型例题.该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或 ...

C语言之函数调用17—递归法之中的一个般函数的调用(2)

//递归法 /* ================================================================== 题目:求F(60),当中F(n)定义例如以下: ...

C语言之函数调用11—递归法求Hermite函数

/*递归法! ========================================== 题目: Hermite 函数:输入n.x,求Hn(x)? H0(x)=1; H1(x)=2*x; H ...

算法笔记_013:汉诺塔问题(Java递归法和非递归法)

目录 1 问题描述 2 解决方案  2.1 递归法 2.2 非递归法 1 问题描述 Simulate the movement of the Towers of Hanoi Puzzle; Bonus ...

递归法绑定文件夹到导航树&;在指定文件夹下新建文件夹

protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { if (Request.QueryString[&q ...

PHP利用递归法获取多级类别的树状数组

数据结构:category(id, pid, name),对应:信息ID,父项ID,类别名 测试数据: $aryCate = array( array('id' => 1, 'pid' => ...

回溯法 leetcode题解 Combination Sum 递归法

题目大意:给出一个数组,用这些数组里的元素去凑一个target.元素可以重复取用. 感觉对这种题目还是生疏的.脑子里有想法,但是不知道怎么表达出来. 先记录下自己的递归法.应该还可以用循环实现. 回溯 ...

用递归法计算从n个人中选选k个人组成一个委员会的不同组合数

用递归法计算从n个人中选选k个人组成一个委员会的不同组合数. 分析 由n个人里选k个人的组合数= 由n-1个人里选k个人的组合数+由n-1个人里选k-1个人的组合数: 当n = k或k = 0时,组合 ...

JavaScript 递归法排列组合二维数组2

二维数组排列组合

随机推荐

MySQL一个语句查出各种整形占用字节数及最大最小值

直接上码: as min_num union , union , union , union , union ,) union ,) union ,) union ,) union ,); +---- ...

数据库报ORA-00600: 内部错误代码, 参数: [17059],并产生大量trace日志文件

用户反馈数据库服务器磁盘空间使用耗尽. 登录服务器后查看,发现数据库产生大量的trace日志,并在alert日志中发现ora-600错误 alert日志信息: Fri Jul :: Errors ): ...

PS 的参考线

新建参考线 菜单:"视图-新建参考线", 直接输入想要位置的参考线.   参考线对齐 按住Shift键拉辅助线,辅助线会自动对齐到当前标尺的刻度上.           按住Alt ...

JS常用的设计模式(12)—— 迭代器模式

迭代器模式提供一种方法顺序访问一个聚合对象中各个元素,而又不需要暴露该方法中的内部表示. js中我们经常会封装一个each函数用来实现迭代器. array的迭代器: forEach = functio ...

phpMyAdmin下载与安装

Part1 phpMyAdmin下载 浏览器输入网址 http://www.phpmyadmin.net 下载即可 我的下载是这样的 Part2 phpMyAdmin安装 解压下载的压缩包到apach ...

使用FastReport的UserDataSet时候,遇到TfrxMemoView内容过多而打印不全的问题

解决方案很简单,就是把Memo所在的Band勾选Stretch就行了.另外还可勾选StartNewPage. 至于UserDataSet本身,猜测就是人为的构造一个类似数据库的集合,大致使用代码如下: ...

Linux 安装Xampp以后,Apache服务器无法启动,以及启动后,连接sql数据库遇到的问题的解决方法

xampp安装以后,搭建服务器的时候,我们会遇到哪些问题呢?1.MySQL Database 可以启动,而Apache Web Server无法启动?应该是80端口被占用,那么如何解决呢?我们可以通过 ...

NancyFX 附录: Nuget程序包

Nancy.Authentication.Forms 该程序包向Nancy提供标准的基于ASP.NET/IIS的表单身份验证服务. 采用这个模块启用身份验证后,可以获得标准ASP.NET表单验证方式. ...

git使用,提交代码简记

强制覆盖本地修改:git reset --hard 项目初始时获取前端代码: git clone https://git.oschina.net/yudian/yudian-frontend.git ...

你可能感兴趣的:(c语言递归方法排序)