泛型归并排序

原创 2007年09月18日 00:23:00

#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());

 

相关文章推荐

泛型归并排序(java 语言实现)

以下实例实现了 1. 实现了Comparable 接口的基本类型的泛型排序,2. 复杂或者说自定义对象的泛型排序,使用 Comparator 接口定制的比较器泛型归并排序主要代码package com...
  • stuShan
  • stuShan
  • 2016年04月22日 10:57
  • 367

用Java泛型实现归并排序(递归和非递归算法)

package ch10; public class MergeSort { /** * 二路归并排序的递归算法-入口 * @param * @param t * @return...

java泛型排序之归并排序

package cqychen.algorithms.part01.charpter01; import java.util.ArrayList; import java.util.Sca...

模板与泛型编程之实现(归并排序)

昨夜突然遇到一道编程,需要查看一趟归并之后,字符串数组的排序情况。因为平时用的程序是基于整型数组,所以就在原有基础上改变了数组参数。此时突然想到,为何不用模板编程的思想改成通用模板函数,这样不管输入的...

数据结构归并排序问题

  • 2017年07月17日 20:23
  • 3KB
  • 下载

二路归并排序

  • 2015年06月06日 23:21
  • 38KB
  • 下载

关系型数据库工作原理-归并排序(翻译自Coding-Geek文章)

本文翻译自Coding-Geek文章:《 How does a relational database work》。原文链接:http://coding-geek.com/how-databases-...

递归归并排序算法

  • 2017年11月02日 22:33
  • 2KB
  • 下载

归并排序算法

  • 2013年10月27日 09:56
  • 5KB
  • 下载

泛型归并单字段排序

泛型归并单字段排序
  • NealQiu
  • NealQiu
  • 2015年09月11日 17:28
  • 265
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:泛型归并排序
举报原因:
原因补充:

(最多只允许输入30个字)