【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,如需转载请自行联系原作者





相关文章
|
15天前
|
机器学习/深度学习 安全 算法
【图论】【割点】【C++算法】928. 尽量减少恶意软件的传播 II
【图论】【割点】【C++算法】928. 尽量减少恶意软件的传播 II
|
30天前
|
存储 算法 Serverless
【C/C++ 数据结构】深入探索数据结构中算法复杂度:从C++和数学的视角
【C/C++ 数据结构】深入探索数据结构中算法复杂度:从C++和数学的视角
46 0
|
30天前
|
存储 算法 数据管理
【C/C++ 基础算法】 C/C++ 位图算法的使用
【C/C++ 基础算法】 C/C++ 位图算法的使用
35 0
|
30天前
|
缓存 算法 C语言
【C++ 标准查找算法 】C++标准库查找算法深入解析(In-depth Analysis of C++ Standard Library Search Algorithms)
【C++ 标准查找算法 】C++标准库查找算法深入解析(In-depth Analysis of C++ Standard Library Search Algorithms)
46 0
|
6天前
|
算法
代码随想录算法训练营第五十六天 | LeetCode 647. 回文子串、516. 最长回文子序列、动态规划总结
代码随想录算法训练营第五十六天 | LeetCode 647. 回文子串、516. 最长回文子序列、动态规划总结
28 1
|
13天前
|
存储 算法
算法系列--动态规划--子序列(2)(下)
算法系列--动态规划--子序列(2)(下)
22 0
|
15天前
|
算法 测试技术 C#
【广度优先搜索】【堆】【C++算法】407. 接雨水 II
【广度优先搜索】【堆】【C++算法】407. 接雨水 II
|
15天前
|
算法 测试技术 Serverless
【二分查找】【C++算法】378. 有序矩阵中第 K 小的元素
【二分查找】【C++算法】378. 有序矩阵中第 K 小的元素
|
15天前
|
算法 测试技术 C#
【字典树】【KMP】【C++算法】3045统计前后缀下标对 II
【字典树】【KMP】【C++算法】3045统计前后缀下标对 II
|
1月前
|
传感器 算法 计算机视觉
基于肤色模型和中值滤波的手部检测算法FPGA实现,包括tb测试文件和MATLAB辅助验证
该内容是关于一个基于肤色模型和中值滤波的手部检测算法的描述,包括算法的运行效果图和所使用的软件版本(matlab2022a, vivado2019.2)。算法分为肤色分割和中值滤波两步,其中肤色模型在YCbCr色彩空间定义,中值滤波用于去除噪声。提供了一段核心程序代码,用于处理图像数据并在FPGA上实现。最终,检测结果输出到&quot;hand.txt&quot;文件。