1. /***********************************************************************************************
  2. 1.设定两个指针,最初位置分别为两个已经排序序列的起始位置
  3. 2.比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
  4. 3.重复步骤3直到某一指针达到序列尾
  5. 4.将另一序列剩下的所有元素直接复制到合并序列尾
  6. 归并排序:
  7. 归并排序具体工作原理如下(假设序列共有n个元素):
  8. 1.将序列每相邻两个数字进行归并操作,形成floor(n / 2)个序列,排序后每个序列包含两个元素
  9. 2.将上述序列再次归并,形成floor(n / 4)个序列,每个序列包含四个元素
  10. 3.重复步骤2,直到所有元素排序完毕
  11.  
  12. 归并排序是稳定的,它的最差,平均,最好时间都是O(nlogn)。但是它需要额外的存储空间.
  13. 何问起 hovertree.com
  14.  
  15. 归并排序法(Merge Sort,以下简称MS)是分治法思想运用的一个典范。
  16. 其主要算法操作可以分为以下步骤:
  17. Step 1:将n个元素分成两个含n/2元素的子序列
  18. Step 2:用MS将两个子序列递归排序(最后可以将整个原序列分解成n个子序列)
  19. Step 3:合并两个已排序好的序列
  20.  
  21. ************************************************************************************************/
  22.  
  23. #include<iostream>
  24. #include<cstdio>
  25. #include<cstring>
  26. #include<algorithm>
  27. #include<cmath>
  28. #include<climits>
  29. #include<cstdlib>
  30. #include<time.h>
  31. #include<cstdlib>
  32. #include<cstdio>
  33. using namespace std;
  34. void Random(int a[],int n)
  35. {
  36. int i=;
  37. srand( (unsigned)time( NULL ) );
  38. while(i<n)
  39. {
  40. a[i++]=rand();
  41. }
  42. }
  43. void merge(int *a, int low, int mid, int high) //归并操作
  44. {
  45. int k, begin1, begin2, end1, end2;
  46. begin1 = low;
  47. end1 = mid;
  48. begin2 = mid + ;
  49. end2 = high;
  50. int *temp = (int *) malloc((high - low + ) * sizeof(int));
  51. for(k = ; begin1 <= end1 && begin2 <= end2; k++) //自小到大排序
  52. {
  53. if(a[begin1] <= a[begin2])
  54. temp[k] = a[begin1++];
  55. else
  56. temp[k] = a[begin2++];
  57. }
  58. if(begin1 <= end1) //左剩
  59. memcpy(temp + k, a + begin1, (end1 - begin1 + ) * sizeof(int));
  60. else //右剩
  61. memcpy(temp + k, a + begin2, (end2 - begin2 + ) * sizeof(int));
  62. memcpy(a + low, temp, (high - low + ) * sizeof(int)); //排序后复制到原数组
  63. free(temp); //释放空间
  64. }
  65. void merge_sort(int *a, unsigned int begin, unsigned int end)
  66. {
  67. int mid;
  68. if(begin < end)
  69. {
  70. mid=begin+(end-begin)>>;
  71. //mid = (end + begin) / 2; 防止数据加法溢出
  72. merge_sort(a, begin, mid); //分治
  73. merge_sort(a, mid + , end); //分治
  74. merge(a, begin, mid, end); //合并两个已排序的数列
  75. }
  76. }
  77. int main()
  78. {
  79. int a[];
  80. Random(a,);
  81. for(int i=;i<;i++)
  82. {
  83. cout<<" "<<a[i]<<" ";
  84. }
  85.  
  86. merge_sort(a, , -);
  87. for(int i=;i<;i++)
  88. {
  89. cout<<" "<<a[i]<<endl;
  90. }
  91.  
  92. return ;
  93.  
  94. }

推荐:http://www.cnblogs.com/roucheng/p/cppjy.html

二路归并排序算法实现-完整C语言程序的更多相关文章

  1. 统计C语言程序行数

    补充前一篇中统计C语言程序行数的程序 写得比较匆忙,可能有些失误,等弄明白GitHub的用法并完善程序后再补充完整代码链接 没有写成函数,但经过简单修改可以作为一个计算或判断函数使用 判断算法主要为以 ...

  2. 关于中值滤波算法,以及C语言实现(转)

    源:关于中值滤波算法,以及C语言实现 1.什么是中值滤波? 中值滤波是对一个滑动窗口内的诸像素灰度值排序,用其中值代替窗口中心象素的原来灰度值,它是一种非线性的图像平滑法,它对脉冲干扰级椒盐噪声的抑制 ...

  3. C语言学习-01第一个C语言程序

    一 C语言的历史 C语言是一门通用计算机编程语言,应用广泛.C语言的设计目标是提供一种能以简易的方式编译.处理低级存储器.产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言. 尽管C语言提供 ...

  4. 归并排序算法(C#实现)

    归并排序(Merge Sort)是利用"归并"技术来进行排序.归并是指将若干个已排序的子文件合并成一个有序的文件.归并排序有两种方式:1): 自底向上的方法 2):自顶向下的方法 ...

  5. 如何用OS X的Xcode写C语言程序

    声明:以下内容非本人原创,转载于别处.拿出来只是分享给FY们,不喜勿喷!原创地址http://blog.yorkxin.org/posts/2009/03/15/fundamental-c-with- ...

  6. FFT算法的完整DSP实现(转)

    源:FFT算法的完整DSP实现 傅里叶变换或者FFT的理论参考: [1] http://www.dspguide.com/ch12/2.htm The Scientist and Engineer's ...

  7. python实现折半查找算法&&归并排序算法

    今天依旧是学算法,前几天在搞bbs项目,界面也很丑,评论功能好像也有BUG.现在不搞了,得学下算法和数据结构,笔试过不了,连面试的机会都没有…… 今天学了折半查找算法,折半查找是蛮简单的,但是归并排序 ...

  8. C语言程序内存布局

    C语言程序内存布局 如有转载,请注明出处:http://blog.csdn.net/embedded_sky/article/details/44457453 作者:super_bert@csdn 一 ...

  9. C语言程序猿必会的内存四区及经典面试题解析

    前言: 为啥叫C语言程序猿必会呢?因为特别重要,学习C语言不知道内存分区,对很多问题你很难解释,如经典的:传值传地址,前者不能改变实参,后者可以,知道为什么?还有经典面试题如下: #include & ...

随机推荐

  1. iOS ARC模式 内存管理

     1,测试一 ;i<;i++) { NSLog(@"i = %d",i); } 2,测试二 ;i<;i++) { NSLog(@"i = %d",i ...

  2. Node.js入门:异步IO

    异步IO     在操作系统中,程序运行的空间分为内核空间和用户空间.我们常常提起的异步I/O,其实质是用户空间中的程序不用依赖内核空间中的I/O操作实际完成,即可进行后续任务. 同步IO的并行模式 ...

  3. paip.mysql 性能测试by mysqlslap

    paip.mysql 性能测试by mysqlslap   作者Attilax  艾龙,  EMAIL:1466519819@qq.com  来源:attilax的专栏 地址:http://blog. ...

  4. salesforce 零基础学习(三十一)关于LookUp字段点击Save时的Validation

    今天在群里大概遇到了这样一个问题,明明这个User存在,但是save的时候提示信息说Value不存在,大概的意思如下图所示,目前认为这种问题常见的可能情况有两种. 一.此字段设置Validation ...

  5. KnockoutJS 3.X API 第五章 高级应用(5) 使用预处理扩展Knockout绑定语法

    注意:这是一种高级技术,通常仅在创建可重用绑定或扩展语法的库时使用. 这不是你通常需要做的时候使用Knockout构建应用程序. 从Knockout 3.0开始,开发人员可以通过提供在绑定过程中重写D ...

  6. 3D touch在Unity3D中的使用

    0.开篇: 3D touch随着iOS9发布,它并不是一个单独的技术,而是可以分为pressure sensitivity.quick action以及peek&pop.在官方的介绍中提到可以 ...

  7. Visual-Studio-2015-Cheat-Sheet Visual Studio 2015 快捷键列表

    PDF 文件下载 http://files.cnblogs.com/files/JamesLi2015/Visual-Studio-2015-Cheat-Sheet.pdf

  8. 初了解NodeJS

    发现了NodeJS以后让我有一种很激动的心情,因为它能做我以前一直想写的东西,而如果没有NodeJS我还需要去学习别的语言,但是有了NodeJS以后就可以通过Javascript来写我的程序了,不得不 ...

  9. 关于CPU Cache -- 程序员需要知道的那些事

    本文将介绍一些作为程序猿或者IT从业者应该知道的CPU Cache相关的知识.本章从"为什么会有CPU Cache","CPU Cache的大致设计架构",&q ...

  10. 基于Metronic的Bootstrap开发框架经验总结(4)--Bootstrap图标的提取和利用

    在前面的一篇随笔<基于Metronic的Bootstrap开发框架经验总结(1)-框架总览及菜单模块的处理>介绍了菜单模块的处理,主要介绍如何动态从数据库里面获取记录并构建菜单列表.其中菜 ...