/***********************************************************************************************
1.设定两个指针,最初位置分别为两个已经排序序列的起始位置
2.比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
3.重复步骤3直到某一指针达到序列尾
4.将另一序列剩下的所有元素直接复制到合并序列尾
归并排序:
归并排序具体工作原理如下(假设序列共有n个元素):
1.将序列每相邻两个数字进行归并操作,形成floor(n / 2)个序列,排序后每个序列包含两个元素
2.将上述序列再次归并,形成floor(n / 4)个序列,每个序列包含四个元素
3.重复步骤2,直到所有元素排序完毕 归并排序是稳定的,它的最差,平均,最好时间都是O(nlogn)。但是它需要额外的存储空间.
何问起 hovertree.com 归并排序法(Merge Sort,以下简称MS)是分治法思想运用的一个典范。
其主要算法操作可以分为以下步骤:
Step 1:将n个元素分成两个含n/2元素的子序列
Step 2:用MS将两个子序列递归排序(最后可以将整个原序列分解成n个子序列)
Step 3:合并两个已排序好的序列 ************************************************************************************************/ #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<climits>
#include<cstdlib>
#include<time.h>
#include<cstdlib>
#include<cstdio>
using namespace std;
void Random(int a[],int n)
{
int i=;
srand( (unsigned)time( NULL ) );
while(i<n)
{
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 + ;
end2 = high;
int *temp = (int *) malloc((high - low + ) * sizeof(int));
for(k = ; 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 + ) * sizeof(int));
else //右剩
memcpy(temp + k, a + begin2, (end2 - begin2 + ) * sizeof(int));
memcpy(a + low, temp, (high - low + ) * sizeof(int)); //排序后复制到原数组
free(temp); //释放空间
}
void merge_sort(int *a, unsigned int begin, unsigned int end)
{
int mid;
if(begin < end)
{
mid=begin+(end-begin)>>;
//mid = (end + begin) / 2; 防止数据加法溢出
merge_sort(a, begin, mid); //分治
merge_sort(a, mid + , end); //分治
merge(a, begin, mid, end); //合并两个已排序的数列
}
}
int main()
{
int a[];
Random(a,);
for(int i=;i<;i++)
{
cout<<" "<<a[i]<<" ";
} merge_sort(a, , -);
for(int i=;i<;i++)
{
cout<<" "<<a[i]<<endl;
} return ; }

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

最新文章

  1. PHP中$_SERVER的详细参数
  2. PHP学习笔记:删除与销毁session
  3. codeforces 712A A. Memory and Crow(水题)
  4. maven编译项目时提示:cached in the local repository
  5. 转帖:使用TortoiseGit处理代码冲突
  6. (转)《深入理解java虚拟机》学习笔记10——并发编程(二)
  7. Microsoft Office Visio Professional 2007密钥
  8. Linux中 pid_t 类型的定义.
  9. TENX_ASM.uew
  10. numpy 实践记录
  11. Flask 快速使用 —— (1)
  12. Android Studio搭建系统App开发环境
  13. 使用 vagrant新建Linux虚拟机
  14. mysql错误汇集
  15. hdu 2097 sky数(进制转换)
  16. leetCode题解之Longest Palindrome
  17. 【BZOJ】【1876】【SDOI2009】SuperGCD
  18. IETESTER ie10.local 下载
  19. RHCE7 管理II-2 通过grep使用正则表达式
  20. Hive之 数据存储

热门文章

  1. 一个用微软官方的OpenXml读写Excel 目前网上不太普及的方法。
  2. java回顾rmi
  3. 将不确定变为确定~transactionscope何时提升为分布式事务?(sql2005数据库解决提升到MSDTC的办法)
  4. Struts2中Action取得表单数据的几种方法
  5. jS事件之网站常用效果汇总
  6. Open Cascade DataExchange DXF
  7. 编写可编辑的List控件
  8. easyui-datagrid行数据field原样输出html标签
  9. PHP的学习--PHP的闭包
  10. C#基础-----面向对象