归并排序,递归法,C语言实现。
利用归并排序法对序列排序的示意图(递归法):

一、算法分析:利用递归的分治方法: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<stdio.h>
#include<stdlib.h>
#include<time.h> #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语言实现。的更多相关文章
- 八皇后问题详细分析与解答(递归法解答,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
		
<html> <head> <title>二维数组排列组合</title> </head> <body> <div id= ...
 
随机推荐
- Windows下使用cmd启动Oracle EM和sql命令使用+主机身份认证
			
(1)cmd命令下使用sql命令 >sqlplus / as sysdba sql>select * from v$version; (2)cmd命令下启动Oracle EM 安装完ora ...
 - 一个优秀php程序员应具备什么样的能力
			
1:php能力 1.1 熟悉 一种或者几种框架,并可以用于开发 1.2 了解 这些框架中的优点与缺点 1.3 假如要你选择框架,你会使用哪种最适合你开发 2:数据库能力 2.1:能写一些简单的sql语 ...
 - HBase性能优化方法总结(转)
			
本文主要是从HBase应用程序设计与开发的角度,总结几种常用的性能优化方法.有关HBase系统配置级别的优化,这里涉及的不多,这部分可以参考:淘宝Ken Wu同学的博客. 1. 表的设计 1.1 Pr ...
 - 视频边下边播--缓存播放数据流-b
			
google搜索“iOS视频变下边播”,有好几篇博客写到了实现方法,其实只有一篇,其他都是copy的,不过他们都是使用的本地代理服务器的方式. 原理很简单,但是缺点也很明显,需要自己写一个本地代理服务 ...
 - POSIX多线程编程(上)-基本概念
			
线程概念 我们把正在计算机中执行的程序叫做"进程"(Process) ,而不将其称为程序(Program).所谓"线程"(Thread),是"进程&q ...
 - hadoop-streaming 配置之---参数分割
			
map: -D stream.map.output.field.separator=. 定义mapoutput字段的分隔符为. 用户可以自定义分隔符(除了默认的tab) -D stream.num.m ...
 - ExtJS4.2学习(19)在线编辑器Ext.form.HtmlEditor(转)
			
鸣谢:http://www.shuyangyang.com.cn/jishuliangongfang/qianduanjishu/2013-12-24/191.html --------------- ...
 - JAVA File常用的API介绍
			
package coreJava; import java.io.File; import java.io.IOException; public class FileDemo { public st ...
 - 解决win8 plsql无法登录
			
今天安装完oracle客户端,然后打开 plsql 之后,就一个提示框,提示没有登录,后来解决方法如下: 在plsql的图标上点右键,以管理员身份运行,即可! 如果不想一直点右键执行,就图标上点右键- ...
 - codeforces 387C	 George and Number
			
这道题目的意思是对于每个要删除的数字,向前或向后找到一块连续的数字,而它是其中最小的: 很容易看出对于所有要先删除的数字要从大到小删除: 然后对于每个要删除的字母,要找到比他小的,但是在原数列中又靠它 ...