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类型 第一个用于合并的数组,合并后 ...
随机推荐
- c语言 判断字符串长度 实现
/* 首先明白答案的本质(该函数)是一个计数器该计数器用for循环来实现实现对一串字符串的计数字符串以空格开头 不计算空格 计算空格后的数字直到遇到\0结束.num计算器字符串不以空格结束 计算空格后 ...
- PostgreSQL学习笔记(一)—— macOS下安装
安装命令:brew install postgresql 我的终端是zsh,所以添加环境变量到~/.zshrc vim ~/.zshrc export PATH=$PATH:/usr/local/Ce ...
- Go grpc 与 protobuf
现在很多微服务内部的通信协议都采用rpc,性能高,安全.而grpc则是google退出的rpc plus. protobuf是传输协议,性能高,强大. 来一个server client的通信demo, ...
- Docker登录容器命令
1. docker exec -i -t 13496e7d5830(容器名) /bin/sh 2.退出容器命令 exit
- 多次执行echarts时出现 there is a chart instance already initialized on the dom
原因,多次使用 echarts.init(document.getElementById(this.options.zid)); 解决方案 设为全局
- for循环优化
转自:https://blog.csdn.net/lfc18606951877/article/details/78592823 1:多个for循环时,遵循外小内大(从外至里,循环对象size要从小到 ...
- exchange From Middle English eschaunge
exchange From Middle English eschaunge, borrowed from Anglo-Norman eschaunge exchange 1.An act of ex ...
- 通过公网ip访问虚拟机web服务
工作中有需要进行通过外网ip访问虚拟机上的web服务,通过查阅资料,将配置过程整理如下: 思路:通过路由器的端口映射访问虚拟机上的web服务 1. 前提是在虚拟机上的web服务已经部署好,并且可以通过 ...
- 数据库与数据仓库的区别实际讲的是OLTP与OLAP的区别
什么是数据仓库 数据仓库,英文名称为Data Warehouse,可简写为DW或DWH.数据仓库,是为企业所有级别的决策制定过程,提供所有类型数据支持的战略集合.它出于分析性报告和决策支持目的而创建. ...
- docker复制文件到宿主机
从主机复制到容器 sudo docker cp host_path containerID:container_path 从容器复制到主机 sudo docker cp containerID:con ...