博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【C++实现有序子序列合并算法】
阅读量:6816 次
发布时间:2019-06-26

本文共 2216 字,大约阅读时间需要 7 分钟。

C++实现简单的合并算法模板


复制内容到剪贴板

代码:
/**
* project: merge template
* author:billhoo
* date: 2012年3月6日
*/
#pragma once
#ifndef _MERGE_H
#define _MERGE_H

#include<iterator>  //iterator_trais

template<class Iterator, class Comp>
void merge(Iterator beg, Iterator middle, Iterator end){

  typedef typename std::iterator_traits<Iterator>::value_type val_t;
  typedef typename std::iterator_traits<Iterator>::difference_type iterdiff_t;

  const iterdiff_t leftArrLength = std::distance(beg, middle);
  const iterdiff_t rightArrLength = std::distance(middle, end);
  val_t *leftArr = new val_t[leftArrLength];
  val_t *rightArr = new val_t[rightArrLength];

  //copy left and right subsequence into new array respectively
  std::copy(beg, middle, leftArr);
  std::copy(middle, end, rightArr);
  
  Iterator index = beg;
  iterdiff_t leftArrIdx = 0;
  iterdiff_t rightArrIdx = 0;

  //do merge
  while(leftArrLength > leftArrIdx && rightArrLength > rightArrIdx){

    if(Comp()(leftArr[leftArrIdx], rightArr[rightArrIdx]))
      *index++ = leftArr[leftArrIdx++];
    else
      *index++ = rightArr[rightArrIdx++];
  }// end of while

  if(leftArrIdx < leftArrLength)
    std::copy(leftArr + leftArrIdx, leftArr + leftArrLength, index);
  else
    std::copy(rightArr + rightArrIdx, rightArr + rightArrLength, index);

  delete [] leftArr;
  delete [] rightArr;
}// end of merge

#endif // _MERGE_H

/**
* author:billhoo
* date: 2012年3月6日
*/
#include<iostream>
#include<list>

#include"merge.h"  //merge
#include"display_array.h"  //displayArr

using std::cout;
using std::endl;
using std::list;

int main(int argc, char **argv){

  int intArr[ ] = {1,2,5,8,9,0,3,4,5,7};
  int *intArrEnd = intArr + sizeof(intArr) / sizeof(*intArr);
  
  list<int> intList(intArr, intArrEnd);

  cout<<"ints array merge..."<<endl;
  displayArr<int*>(intArr, intArr + 10);
  merge<int*, std::less<int>>(intArr, intArr + 5, intArrEnd);
  displayArr<int*>(intArr, intArr + 10);

  list<int>::iterator middle = intList.begin();
  std::advance(middle, 5);
  cout<<"\nints list merge..."<<endl;
  displayArr(intList.begin(), intList.end());
  merge<list<int>::iterator, std::less<int>>(intList.begin(), middle, intList.end());
  displayArr(intList.begin(), intList.end());

  return EXIT_SUCCESS;
}             本文转自Bill_Hoo 51CTO博客,原文链接:http://blog.51cto.com/billhoo/797754,如需转载请自行联系原作者
你可能感兴趣的文章
VS 断点不会命中的情况
查看>>
通用类 Js 显示消息提示对话框,不输出页面内容,并返回上一页
查看>>
格式化字符串
查看>>
Oracle通过SQL语句查看table所引用的对象(View/Function/Procedure/Trigger)
查看>>
jenkins权限配置不对导致jenkins无法登陆
查看>>
java 向上转型与向下转型
查看>>
4.11搭建网站的两个小问题
查看>>
Java知多少(44)异常类型
查看>>
什么是Servlet?它有哪些特点
查看>>
BZOJ 1497 [NOI2006]最大获利
查看>>
深入浅出KNN算法(二) sklearn KNN实践
查看>>
github上face_recognition工程项目实践
查看>>
Bzoj3992:[SDOI2015]序列统计
查看>>
ZJOI2018外省选手酱油记Day1
查看>>
如何用OpenCV自带的adaboost程序训练并检测目标
查看>>
SSM-MyBatis-08:Mybatis中SqlSession的commit方法为什么会造成事物的提交
查看>>
C++ 生成随机数
查看>>
poj1014
查看>>
poj3087
查看>>
mybatis generator
查看>>