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

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

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define MAX_SIZE 50000
  4. int mydata[MAX_SIZE+];
  5. int mysize;//向量元素实际个数void my_merge(int lo,int mi,int hi)//合并两个序列
  6. {
  7. //A分为b,c左右两个数组
  8. int *A=mydata+lo;//合并后的向量
  9. int *C=mydata+mi;
  10. int lb=mi-lo,lc=hi-mi; //b,c数组的长度
  11. int *B=new int[lb];//创建B数组=A[0-lb]
  12. //int *B=(int*)malloc(sizeof(int)*lb);
  13. for(int i=;i<lb;i++) B[i]=A[i]; //复制
  14. int j=,k=;//b,c
  15. for(int i=;j<lb;){
  16. if(j<lb&&(B[j]<=C[k]|| k>=lc/*c空了*/ )) A[i++]=B[j++];
  17. if(k<lc&&(C[k]<B[j])) A[i++]=C[k++];
  18. }//时间< O(n)
  19. delete [] B;
  20. //free(B);
  21. }//一共logn层
  22. void mergeSort(int lo,int hi)//归并排序
  23. {
  24. int mi=(lo+hi)>>;
  25. if(lo+>hi) return;
  26. mergeSort(lo,mi);
  27. mergeSort(mi,hi);//分治
  28. my_merge(lo,mi,hi);//合并
  29. }//归并排序总的时间复杂度
  30. int main(void)
  31. {
  32. int n;
  33. scanf("%d",&n);
  34. mysize=n;
  35. for(int i=;i<n;i++)
  36. scanf("%d",&mydata[i]);
  37. mergeSort(,mysize);
  38. return ;
  39. }

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

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

比如:

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

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

代码实现请看:

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

c++合并两个序列函数merge()和inplace_merge()的更多相关文章

  1. 合并两个sorted ranges(merge和inplace_merge)

    merge //版本一:用operator <比较元素 template <class InputerIterator1,class InputerIterator2,class Outp ...

  2. LeetCode 21. 合并两个有序链表(Merge Two Sorted Lists)

    21. 合并两个有序链表 21. Merge Two Sorted Lists 题目描述 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. LeetCode ...

  3. 高效合并两个有序数组(Merge Sorted Array)

    Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array. Note: Y ...

  4. [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 ...

  5. [Swift]LeetCode88. 合并两个有序数组 | Merge Sorted Array

    Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array. Note: T ...

  6. LeetCode 21:合并两个有序链表 Merge Two Sorted Lists

    将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. Merge two sorted linked lists and return it as a new ...

  7. ADO:DataSet合并两张表( ds.Merge(ds1))

    原文发布时间为:2008-08-01 -- 来源于本人的百度文章 [由搬家工具导入] using System;using System.Data;using System.Configuration ...

  8. LeetCode 23. 合并K个排序链表(Merge Two Sorted Lists)

    23. 合并K个排序链表 23. Merge k Sorted Lists 题目描述 合并 k 个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度. LeetCode23. Merge k S ...

  9. Js $.merge() 函数(合并两个数组内容到第一个数组)

    定义和用法 $.merge() 函数用于合并两个数组内容到第一个数组. 语法 $.merge( first, second )   参数 描述 first Array类型 第一个用于合并的数组,合并后 ...

随机推荐

  1. javascript document.createElement() document.createTextNode() appendChild()

    //--------------document.createElement("div") var div = document.createElement("div&q ...

  2. nohup 日志按天输出

    输出日志在当前目录: nohup java -jar ace-auth.jar >> nohup`date +%Y-%m-%d`.out 2>&1 & 指定日志目录输 ...

  3. Zookeeper的典型应用场景(转)

    在寒假前,完成了Zookeeper系列的前5篇文章,主要是分布式的相关理论,包括CAP,BASE理论,分布式数据一致性算法:2PC,3PC,Paxos算法,Zookeeper的相关基本特性,ZAB协议 ...

  4. NFS实现多服务器文件共享

    服务器 1.安装所需的软件包 yum install -y rpc-bind nfs-utils 2.设为开机自启动 systemctl enable nfs systemctl enable rpc ...

  5. Js的iframe相关问题,如何判断当前是否在iframe中,iframe和它的父窗口如何通信

    一.前言: 在web中,为了丰富我们的内容,往往需要引用其它HTML文件,这时候就需要用到 iframe 标签,本文就主要记录一下使用iframe所需要注意的问题 iframe 所使用的环境(笔者所遇 ...

  6. EF6 + MySql 建立项目引用失败

    EF6 + MySql 建立项目 步骤 在项目中使用” NuGet” 包添加 EntityFramework 和 MySql.Data ,如下图 (1)       在NuGet界面中的“浏览”选项卡 ...

  7. easy ui 弹框叠加问题

    1.框架用的是.net MVC,Index页面如下所示: @{ Layout = "~/Views/Shared/_CustomerLayout.cshtml"; ViewBag. ...

  8. FI-FBV0 - No batch input data for screen SAPMF05A 0700

    在预制凭证过账的时候报错:没有屏幕SAPMF05A 0700 的批输入数据 https://answers.sap.com/questions/7203025/fbv0-no-batch-input- ...

  9. POSIX多线程

    全文共分四部分: POSIX多线程—概述    POSIX多线程—异步编程举例    POSIX多线程—线程基本概念    POSIX多线程—互斥量概述 POSIX多线程—概述 Content 1. ...

  10. VS2017 密钥

    需要的请自取- Enterprise: NJVYC-BMHX2-G77MM-4XJMR-6Q8QF Professional: KBJFW-NXHK6-W4WJM-CRMQB-G3CDH