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

一、算法分析:利用递归的分治方法: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语言实现。的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

  7. 回溯法 leetcode题解 Combination Sum 递归法

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

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

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

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

    <html> <head> <title>二维数组排列组合</title> </head> <body> <div id= ...

随机推荐

  1. iOSApp -Monkey测试

    IOS操作系统不像Android系统那么方便,各种限制也比较多,目前我的建议还是直接在模拟器上执行monkey测试.如果需要在真机上面执行,可以参考文档: http://testerhome.com/ ...

  2. 瑞昱Realtek(Realtek HD Audio Driver)音频声卡驱动R2.49 for Win7_Vista

    不管是在高端系列主板上,还是在低端系列主板上,我们都能看到Realtek瑞昱的身影,Realtek HD Audio Driver能够支持所有的Realtek HD Audio音频驱动.Realtek ...

  3. PHP与最丑的后台管理系统

    第二天阿Q到公司还是比较早,同事只有阿梅在,阿Q坐在椅子上旋转来旋转去,有点像个小孩子.公司有书柜,书柜上放了好几本很新的php的书,.net的书反倒比较少而且显得老旧.阿Q起身走过去拿了本php翻了 ...

  4. Hadoop NameNode is not formatted.

    2014-08-26 20:27:22,712 WARN org.apache.hadoop.hdfs.server.namenode.FSNamesystem: Encountered except ...

  5. 浏览器九宫格的简单实现 - 蒋宇捷的专栏 - 博客频道 - CSDN.NET

    CSS3 来源:http://blog.csdn.net/hfahe/article/details/6125890#1536434-hi-1-22083-42d97150898b1af15ddaae ...

  6. Hansight

    http://www.hansight.com/scenarios.html#account

  7. Linux配置系统

    配置架构: 三元素: 配置文件, 环境变量, 命令行选项 三级别: 系统级,用户级,程序级 应用: 调用时可能发生变化的配置信息,使用命令行选项:改动很少但确实应该由各个用户自己控制的配置信息,使用用 ...

  8. MySQL can’t specify target table for update in FROM clause

    翻译:MySQL不能指定更新的目标表在FROM子句 源SQL语句: delete from t_official_sys_user where USER_NAME IN(SELECT USER_NAM ...

  9. Android开发之Fragment的介绍、使用及生命周期

    Fragment官网介绍-http://developer.android.com/guide/components/fragments.html 郭大神的使用实例文章:http://blog.csd ...

  10. Grid表格属性

    <Grid> <Grid.ColumnDefinitions> <!--添加列--> <ColumnDefinition Width="/> ...