大家在写归并排序时是不是觉得合并两个序列有点麻烦,有快速的方法吗?

我们全部函数自己写,比如:

#include<bits/stdc++.h>
using namespace std;
#define MAX_SIZE 50000
int mydata[MAX_SIZE+];
int mysize;//向量元素实际个数void my_merge(int lo,int mi,int hi)//合并两个序列
{
//A分为b,c左右两个数组
int *A=mydata+lo;//合并后的向量
int *C=mydata+mi;
int lb=mi-lo,lc=hi-mi; //b,c数组的长度
int *B=new int[lb];//创建B数组=A[0-lb]
//int *B=(int*)malloc(sizeof(int)*lb);
for(int i=;i<lb;i++) B[i]=A[i]; //复制
int j=,k=;//b,c
for(int i=;j<lb;){
if(j<lb&&(B[j]<=C[k]|| k>=lc/*c空了*/ )) A[i++]=B[j++];
if(k<lc&&(C[k]<B[j])) A[i++]=C[k++];
}//时间< O(n)
delete [] B;
//free(B);
}//一共logn层
void mergeSort(int lo,int hi)//归并排序
{
int mi=(lo+hi)>>;
if(lo+>hi) return;
mergeSort(lo,mi);
mergeSort(mi,hi);//分治
my_merge(lo,mi,hi);//合并
}//归并排序总的时间复杂度
int main(void)
{
int n;
scanf("%d",&n);
mysize=n;
for(int i=;i<n;i++)
scanf("%d",&mydata[i]);
mergeSort(,mysize);
return ;
}

我们首先会想到C++algorithm里的merge()函数,merge函数可以把两个有序的序列变成一个新的有序序列(注意是新的),这里是设计三个序列,并不能在原序列上进行操作,可是归并排序要在原序列进行操作。

那么还有一个函数似乎可以帮到我们,inplace_merge()。inplace_merge()有三个必须参数,默认合并后排序是升序的,第一个参数是一个序列的起始位置,第二个是该序列的切分位置,第三个参数是该序列区间的结束位置。

比如:

#include<bits/stdc++.h>
using namespace std;
int main(void)
{
int t,n;
int z[10]={5,6,7,8,9,0,1,2,3,4};
int b[15];
inplace_merge(z,z+5,z+10);
for(int i=0;i<10;i++)
printf("%d ",z[i]);
return 0;
}

  这两个函数详细解析请点击(地址为http://c.biancheng.net/view/568.html)

代码实现请看:

https://www.cnblogs.com/cchun/archive/2012/05/26/2519394.html

最新文章

  1. 【初探移动前端开发05】jQuery Mobile (下)
  2. 在fragment中获取他附着的activity中的变量
  3. 【错误总结之(一)】error LNK2038: 检測到“_ITERATOR_DEBUG_LEVEL”的不匹配项: 值“0”不匹配值“2”
  4. Android之Adapter用法总结
  5. 基于Citus和ASP.NET Core开发多租户应用
  6. 通信传输利器Netty(Net is DotNetty)介绍
  7. thymleaf th:if判断某值不为空
  8. nginx部署~dotnetCore+mvc网站502
  9. Java 多线程总结
  10. cocos2dx JS layuot纯代码实现背景颜色渐变
  11. [android] 手机卫士号码归属地查询
  12. vue--拖动排序
  13. 元素大小-偏移量(offset)客户区大小(client)滚动大小(scroll)
  14. C#-VS字符串、日期、时间和时间段
  15. 用华为eNSP模拟器配置Hybrid、Trunk和Access三种链路类型端口
  16. java Webservice(一)HttpClient使用(二)
  17. 常用flash参数设置
  18. 峰Spring4学习(7)spring对JDBC的支持
  19. Ngnix的日志管理和用定时任务完成日志切割
  20. flask 邮箱配置

热门文章

  1. 2019-7-01 python基础数据类型
  2. golang爬虫
  3. 【基本知识】UART接口
  4. Vuecli3
  5. 四种方法获取可执行程序的文件路径(.NET Core / .NET Framework)
  6. 4.将验证添加到 ASP.NET Core Razor 页面
  7. CentOS7配置网卡上网、安装wget、配置163yum源
  8. IntelliJ IDEA web项目进行数据库连接时出现java.lang.ClassNotFoundException: com.mysql.jdbc.Driver错误解决办法
  9. python基础知识(七)---数据类型补充、&quot;雷区&quot;、编码
  10. centos7#yum install ffmpeg