/***********************************************************************************************

1.设定两个指针,最初位置分别为两个已经排序序列的起始位置

2.比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置

3.重复步骤3直到某一指针达到序列尾

4.将另一序列剩下的所有元素直接复制到合并序列尾

归并排序:

归并排序具体工作原理如下(假设序列共有n个元素):

1.将序列每相邻两个数字进行归并操作,形成floor(n / 2)个序列,排序后每个序列包含两个元素

2.将上述序列再次归并,形成floor(n / 4)个序列,每个序列包含四个元素

3.重复步骤2,直到所有元素排序完毕

归并排序是稳定的,它的最差,平均,最好时间都是O(nlogn)。但是它需要额外的存储空间.

归并排序法(Merge Sort,以下简称MS)是分治法思想运用的一个典范。

其主要算法操作可以分为以下步骤:

Step 1:将n个元素分成两个含n/2元素的子序列

Step 2:用MS将两个子序列递归排序(最后可以将整个原序列分解成n个子序列)

Step 3:合并两个已排序好的序列

************************************************************************************************/

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using namespace std;

void Random(int a[],int n)

{

int i=0;

srand( (unsigned)time( NULL ) );

while(i

{

a[i++]=rand();

}

}

void merge(int *a, int low, int mid, int high) //归并操作

{

int k, begin1, begin2, end1, end2;

begin1 = low;

end1 = mid;

begin2 = mid + 1;

end2 = high;

int *temp = (int *) malloc((high - low + 1) * sizeof(int));

for(k = 0; begin1 <= end1 && begin2 <= end2; k++) //自小到大排序

{

if(a[begin1] <= a[begin2])

temp[k] = a[begin1++];

else

temp[k] = a[begin2++];

}

if(begin1 <= end1) //左剩

memcpy(temp + k, a + begin1, (end1 - begin1 + 1) * sizeof(int));

else //右剩

memcpy(temp + k, a + begin2, (end2 - begin2 + 1) * sizeof(int));

memcpy(a + low, temp, (high - low + 1) * sizeof(int)); //排序后复制到原数组

free(temp); //释放空间

}

void merge_sort(int *a, unsigned int begin, unsigned int end)

{

int mid;

if(begin < end)

{

mid=begin+(end-begin)>>1;

//mid = (end + begin) / 2; 防止数据加法溢出

merge_sort(a, begin, mid); //分治

merge_sort(a, mid + 1, end); //分治

merge(a, begin, mid, end); //合并两个已排序的数列

}

}

int main()

{

int a[20];

Random(a,20);

for(int i=0;i<20;i++)

{

cout<

}

merge_sort(a, 0, 20-1);

for(int i=0;i<20;i++)

{

cout<

}

return 0;

}

二路归并排序算法c语言实现,二路归并排序算法实现-完整C语言程序相关推荐

  1. C语言merge sort归并排序算法(附完整源码)

    C语言merge sort归并排序算法 merge sort归并排序算法的完整源码(定义,实现) merge sort归并排序算法的完整源码(定义,实现) #ifndef MERGE_SORT_H # ...

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

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

  3. 归并排序c语言实验报告,归并排序算法及其C语言具体实现

    本节介绍一种不同于插入排序和归并排序,其排序的实现思想是先将所有的记录完全分开,然后两两合并,在合并的过程中将其排好序,最终能够得到一个完整的有序表. 例如对于含有 n 个记录的无序表,首先默认表中每 ...

  4. 对归并排序进行c语言编程实现,归并排序及C语言实现

    排序系列之(1)归并排序及C语言实现 有很多算法在结构上是递归的:为了解决一个给定的问题,算法需要一次或多次递归的调用其本身来解决相关的问题.这些算法通常采用分治策略:将原问题划分成n个规模较小而结构 ...

  5. 归并排序执行次数_十大排序算法,看这篇就够了

    排序算法分类[1][2] 比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序. 非比较类排序:不通过比较来决定元素间的相对次序,它可以 ...

  6. 【算法知识】详解归并排序算法

    已发布: [算法知识]详解选择冒泡算法 [算法知识]详解选择排序算法 [算法知识]详解插入排序算法 [算法知识]详解快速排序算法 基本思想 归并排序的基本思想是: 先将序列一次次分成子序列,直到子序列 ...

  7. 归并排序时间复杂度_一文带你读懂排序算法(四):归并算法

    点击上方蓝字关注我们 归并排序的基本思想核心是分治,就是把一个复杂的问题分成两个或多个相同或相似的子问题,然后把子问题分成更小的子问题,直到子问题可以简单的直接求解,最原问题的解就是子问题解的合并.算 ...

  8. 重点算法排序之快速排序、归并排序(上篇)

    文章目录 一.排序的概念及常见的排序算法 二.快速排序的思想及代码详解 2.1 快速排序的思想 2.2 挖坑法 2.2.1 挖坑法实现思想 2.2.2 挖坑法举例 2.2.3 挖坑法代码实现 2.3 ...

  9. c语言大数相乘的算法_MIT 算法导论(三)

    标签:b站MIT算法导论课程的一些笔记,整理以(bu)后(hui)看 代码引用标记: 归并排序的C语言实现 第三节 分治法 分治法(Divide and conquer) 1) 分治法的步骤 把问题分 ...

  10. 索骥馆-编程语言之《程序语言的奥妙:算法解读(四色全彩)》扫描版[PDF]

    内容简介: 在我们生活的世界中,各种各样形形色色的事物和现象,其中都必定包含着科学的成分.在这些成分中,有些是你所熟知的,有些是你未知的,有些是你还一知半解的.面对未知的世界,好奇的你是不是有很多疑惑 ...

最新文章

  1. 【廖雪峰python入门笔记】多重循环
  2. Bruce Eckel教你如何爬出 Gradle 的“坑”?
  3. 设置文字QT按钮包含图片与文字,以及鼠标停留备注显示,和sheetstyle风格设置。...
  4. python netsnmp_使用 Net-SNMP 和 IPython
  5. ThreeJS的特效合成器和后期处理通道
  6. Android 自定义长按响应时间
  7. maven 不编译jasper文件_第一个SpringBoot项目、核心配置文件properties(yml、yaml)、集成jsp...
  8. 网络爬虫(一):配置selenium、pycharm(windows平台)
  9. Error dialog box generic entry point
  10. Linux命令之查看文件内容
  11. Double 中的 NAN与INFINITY
  12. 《致云雀》(英)雪莱
  13. 【工具】动软代码生成器连接数据库
  14. CRNN——卷积循环神经网络结构
  15. 社交仅发送图片和视频 -设计测试用例
  16. HTML页面格式化(CSS)
  17. 银河系创投徐芳:专注B2B这片热土,燃起产业新势能
  18. win7系统下连网络打印机打印反应很慢解决方法
  19. ubuntu双系统时间同步_解决Windows与Ubuntu双系统时间同步问题
  20. 【mac】No Xcode or CLT version detected!解决办法

热门文章

  1. 81页智慧城市-大数据决策与支撑平台解决方案
  2. plsql如何连接oracle11g_plsql连接oracle教程
  3. ROS 设置环境变量
  4. GoEasy使用详解
  5. Win7扫雷的H5完整复刻实现(三) / 鼠标左右键同时按下事件与收尾工作的实现
  6. qq音乐推荐下载器(一)——模拟搜索,下载,读取评论制作词云并将下载数据传至数据库
  7. Python 爬虫逆向破解案例实战 (二):STEAM密码加密 (RSA) 逆向
  8. 读react.js小书 01
  9. 新版gsp计算机系统全套资料,新版GSP对计算机系统的需求表
  10. hp 服务器 无线网卡,换个网卡再战!—记惠普4431s笔记本更换无线网卡体验