`
zhangyafei_kimi
  • 浏览: 261644 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

泛型归并排序

J# 
阅读更多

#define SENTINEL_CARD (-1)

#include <vector>

#include <algorithm>

#include <iterator>

#include <functional>

#include <iterator>

template<

class bidirectional_iterator,

template <class> class less_equal_compare = std::less_equal

>

class merge_sort_functor

{

public:

void operator()(

bidirectional_iterator p,

bidirectional_iterator r)const

{

size_t diff = distance(p,r);

if(diff <=1)

return;

if(diff >0)

{

bidirectional_iterator q = p;

advance(q, diff/2);

this->operator ()(p, q);

this->operator ()(q, r);

merge(p, q, r);

}

}

private:

void merge( bidirectional_iterator first,

bidirectional_iterator middle,

bidirectional_iterator last)const

{

using namespace std;

typedef less_equal_compare<bidirectional_iterator::value_type> le;

le le_comparer;

size_t n1 = distance(first, middle);

size_t n2 = distance(middle, last);

std::vector<int> L(first,middle);

std::vector<int> R(middle,last);

L.push_back(SENTINEL_CARD);

R.push_back(SENTINEL_CARD);

std::vector<int>::iterator i=L.begin(), j=R.begin();

for(bidirectional_iterator k=first; distance(k,last)>=0; ++k)

{

if(*i == SENTINEL_CARD)

{

std::copy(j, --R.end(), k);

return;

}

if(*j == SENTINEL_CARD)

{

std::copy(i, --L.end(), k);

return;

}

if( le_comparer(*i,*j) )

*k = *i++;

else

*k = *j++;

}

}

};

测试程序

int b[]={345,67,56,6,4567467,65768,7686,34635,67,57678,235};

vector<int> vi(b,b+sizeof(b)/sizeof(int));

list<int> li(b,b+sizeof(b)/sizeof(int));

merge_sort(b, 0, sizeof(b)/sizeof(int));

merge_sort_functor<vector<int>::iterator, std::less_equal>()

(vi.begin(), vi.end());

merge_sort_functor<list<int>::iterator, std::greater>()

(li.begin(), li.end());

分享到:
评论

相关推荐

    各种排序算法的c++泛型实现

    各种常用的排序算法,c++泛型实现,对于学习排序算法以及c++泛型编程都是很好的材料

    基础排序, 高级排序, 堆, 二分搜索树, 并查集, 图以及图相关算法知识总结

    归并排序 归并排序改进 归并排序自底向上 快速排序 随机化快速排序 双路快速排序 三路快速排序 堆和堆排序 堆的基本存储 ShiftUp ShiftDown 基础堆排序和Heapify 优化的堆排序 索引堆(IndexHeap) 索引堆的优化 二分...

    Java常用排序算法源码

    Java常用排序算法源码 稳定:冒泡排序、插入排序、归并排序和基数排序;不稳定:选择排序、快速排序、希尔排序、堆排序

    九种排序算法研究。。C++向量实现。。

    1、插入排序(InsertSort) 2、冒泡排序(BubbleSort) 3、选择排序(SelectSort) 4、快速排序(QuickSort) 5、希尔排序(ShellSort) ...8、归并排序(MergeSort) 9、基数排序(RadixSort)

    sort:对“模板” C中的例程实现进行排序

    您可以选择许多排序例程,包括: Timsort(稳定) 快速排序合并排序(稳定) 就地归并排序(不稳定) Shellsort 二进制插入排序堆排序选择排序(实际上仅是为了进行比较) 圣杯排序(稳定) 基于 。 感谢Andrey ...

    javalruleetcode-interview-prepartion:面试准备

    java lru leetcode 面试准备 数据结构 堆 用堆栈模拟计算器 为什么列表、堆栈泛型不能是原始类型? ? ? 队列 java的哪个实现用得最多??? 检测周期 链表 ...归并排序 LRU AVL & 红黑树 ##亚马逊

    数据结构与算法分析Java语言描述(第二版)

    排序7.1 预备知识7.2 插入排序7.2.1 算法7.2.2 插入排序的分析7.3 一些简单排序算法的下界7.4 希尔排序7.5 堆排序7.6 归并排序7.7 快速排序7.7.1 选取枢纽元7.7.2 分割策略7.7.3 小数组7.7.4 实际的快速排序例程...

    数据结构与算法分析-Java语言描述(第2版)_2_2

    练习 参考文献第7章 排序 7.1 预备知识 7.2 插入排序 7.2.1 算法 7.2.2 插入排序的分析 7.3 一些简单排序算法的下界 7.4 希尔排序 7.5 堆排序 7.6 归并排序 7.7 快速排序 7.7.1 选取枢纽元 ...

    数据结构与算法分析-Java语言描述(第2版)_1_2

    练习 参考文献第7章 排序 7.1 预备知识 7.2 插入排序 7.2.1 算法 7.2.2 插入排序的分析 7.3 一些简单排序算法的下界 7.4 希尔排序 7.5 堆排序 7.6 归并排序 7.7 快速排序 7.7.1 选取枢纽元 ...

    leetcode题库-ofcoursejava:学习代码仓

    leetcode题库 Java学习代码仓库 特别鸣谢 大佬对我在Java学习上的支持,是我Java学习引路人 讲授的数据结构和算法课,受益匪浅,bobo老师是我认为课讲得最好的算法老师。...归并排序 快速排序 拓扑排序(待更新)

    数据结构与算法分析_Java语言描述(第2版)]

    排序7.1 预备知识7.2 插入排序7.2.1 算法7.2.2 插入排序的分析7.3 一些简单排序算法的下界7.4 希尔排序7.5 堆排序7.6 归并排序7.7 快速排序7.7.1 选取枢纽元7.7.2 分割策略7.7.3 小数组7.7.4 实际的快速排序例程...

    数据结构与算法分析 Java语言描述第2版

    排序7.1 预备知识7.2 插入排序7.2.1 算法7.2.2 插入排序的分析7.3 一些简单排序算法的下界7.4 希尔排序7.5 堆排序7.6 归并排序7.7 快速排序7.7.1 选取枢纽元7.7.2 分割策略7.7.3 小数组7.7.4 实际的快速排序例程...

    数据结构与算法分析_Java语言描述(第2版)

    7.6 归并排序 7.7 快速排序 7.7.1 选取枢纽元 7.7.2 分割策略 7.7.3 小数组 7.7.4 实际的快速排序例程 7.7.5 快速排序的分析 7.7.6 选择问题的线性期望时间算法 7.8 排序算法的一般下界 7.9 桶式排序 7.10 外部排序 ...

    突破程序员基本功的16课.part2

    12.5 归并排序 12.6 桶式排序 12.7 基数排序 12.8 小结 第13课 程序开发 13.1 扎实的基本功 13.1.1 快速的输入能力 13.1.2 编程实现能力 13.1.3 快速排错 13.2 程序开发之前 13.2.1 分析软件的组件模型 ...

    C++ STL 开发技术导引(第6章)

    第4章 C++ STL泛型库概述 48 4.1 C++ STL的发展历程 48 4.2 C++ STL的各种实现版本 49 4.2.1 HP STL 49 4.2.2 SGI STL 50 4.2.3 STLport 50 4.2.4 P.J.Plauger STL 50 4.2.5 Rouge Wave STL 50 4.3...

    C++ STL开发技术导引(第5章)

    第4章 C++ STL泛型库概述 48 4.1 C++ STL的发展历程 48 4.2 C++ STL的各种实现版本 49 4.2.1 HP STL 49 4.2.2 SGI STL 50 4.2.3 STLport 50 4.2.4 P.J.Plauger STL 50 4.2.5 Rouge Wave STL 50 4.3...

    C++ STL开发技术导引(第3章)

    第4章 C++ STL泛型库概述 48 4.1 C++ STL的发展历程 48 4.2 C++ STL的各种实现版本 49 4.2.1 HP STL 49 4.2.2 SGI STL 50 4.2.3 STLport 50 4.2.4 P.J.Plauger STL 50 4.2.5 Rouge Wave STL 50 4.3...

Global site tag (gtag.js) - Google Analytics