c++合并两个序列函数merge()和inplace_merge()
大家在写归并排序时是不是觉得合并两个序列有点麻烦,有快速的方法吗?
我们全部函数自己写,比如:
#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
c++合并两个序列函数merge()和inplace_merge()的更多相关文章
- 合并两个sorted ranges(merge和inplace_merge)
merge //版本一:用operator <比较元素 template <class InputerIterator1,class InputerIterator2,class Outp ...
- LeetCode 21. 合并两个有序链表(Merge Two Sorted Lists)
21. 合并两个有序链表 21. Merge Two Sorted Lists 题目描述 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. LeetCode ...
- 高效合并两个有序数组(Merge Sorted Array)
Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array. Note: Y ...
- [Swift]LeetCode21. 合并两个有序链表 | Merge Two Sorted Lists
Merge two sorted linked lists and return it as a new list. The new list should be made by splicing t ...
- [Swift]LeetCode88. 合并两个有序数组 | Merge Sorted Array
Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array. Note: T ...
- LeetCode 21:合并两个有序链表 Merge Two Sorted Lists
将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. Merge two sorted linked lists and return it as a new ...
- ADO:DataSet合并两张表( ds.Merge(ds1))
原文发布时间为:2008-08-01 -- 来源于本人的百度文章 [由搬家工具导入] using System;using System.Data;using System.Configuration ...
- LeetCode 23. 合并K个排序链表(Merge Two Sorted Lists)
23. 合并K个排序链表 23. Merge k Sorted Lists 题目描述 合并 k 个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度. LeetCode23. Merge k S ...
- Js $.merge() 函数(合并两个数组内容到第一个数组)
定义和用法 $.merge() 函数用于合并两个数组内容到第一个数组. 语法 $.merge( first, second ) 参数 描述 first Array类型 第一个用于合并的数组,合并后 ...
随机推荐
- Python之路【第二十三篇】:数据库基础
数据库的简介 数据库 数据库(database,DB)是指长期存储在计算机内的,有组织,可共享的数据的集合.数据库中的数据按一定的数学模型组织.描述和存储,具有较小的冗余,较高的数据独立性和易扩展性, ...
- C语言提高内容目录
(1)基础 数据类型和变量 内存四区(栈 堆 全局 代码区) (2)指针和字符串操作 指针强化 字符串的基本操作 字符串一级指针内存模型图 字符串做为函数参数 (3)二级指针多级指针 二级指针的输入输 ...
- python--osi七层模型
OSI七层模型 OSI七层参考模型 学计算机的人想必都对OSI七层参考模型不陌生,OSI七层参考模型是国际标准化组织(ISO)制定的一个用于计算机或通信系统间互联的标准体系.它是一个七层的.抽象的模型 ...
- Expected linebreaks to be 'LF' but found 'CRLF'.
解决方法 在rules中加入 "linebreak-style": [0 ,"error", "windows"], 如果你需要知道原理,请 ...
- C# vb .net实现像素化效果滤镜打马赛克
在.net中,如何简单快捷地实现Photoshop滤镜组中的像素化效果打马赛克呢?答案是调用SharpImage!专业图像特效滤镜和合成类库.下面开始演示关键代码,您也可以在文末下载全部源码: 设置授 ...
- C# vb .net实现负片特效滤镜
在.net中,如何简单快捷地实现Photoshop滤镜组中的负片特效呢?答案是调用SharpImage!专业图像特效滤镜和合成类库.下面开始演示关键代码,您也可以在文末下载全部源码: 设置授权 第一步 ...
- 爬虫多次爬取时候cookie的存储用于登入
一.用requests模块自动保存(保存缓存中) 构建一个session对象session = requests.session() 用构建的session代替requests进行访问他就会自动存啦 ...
- CSS疑难杂症
1.text-align: center + letter-spacing: 2em 字体不居中 办法:添加text-indent: 2em 2.first-child伪类选择不到元素 办法:确保备选 ...
- k8s日志收集及存档
k8s日志收集架构图 利用阿里开源的工具log-pilot,往kafka内写日志,然后吐一份至es,另外一份用flume消费kafka数据落盘
- ECharts快速入门
一.简介 ECharts,一个使用 JavaScript 实现的开源可视化库,可以流畅的运行在 PC 和移动设备上,兼容当前绝大部分浏览器(IE8/9/10/11,Chrome,Firefox,Saf ...