泛型归并排序

原创 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
  • 540

归并排序及代码实现

自己实现归并排序+快速排序,二者都是嵌套加递归 归并排序: //归并排序 #include #include using namespace std; void merge_sort(i...
  • chuchus
  • chuchus
  • 2014年03月22日 20:30
  • 1394

利用Python实现归并排序

在讲归并排序之前我们先来了解一下什么是分治算法。为什么归并排序属于分治算法的体现。 分治算法分治算法基本思想就是将一个比较大规模的问题分解成为若干个规模较小的问题来解决。这些小问题相当于是原问题的子集...
  • minxihou
  • minxihou
  • 2016年07月04日 15:09
  • 2163

算法系列(四)排序算法中篇--归并排序和快速排序

在算法系列(三)排序算法上篇 一文中,介绍了冒泡排序,插入排序和选择排序算法。这篇文章继续讲解排序算法。 概述 冒泡排序,插入排序和选择排序算法这些算法的时间复杂度都是O(N^2),是否有更高效的排序...
  • robertcpp
  • robertcpp
  • 2016年05月30日 23:04
  • 3405

归并排序及其应用

1 归并排序的特点归并排序是一种利用分治技术来实现一种稳定排序算法,该算法的时间复杂度为O(nlogn),该算法的常数因子比较大,通常应用于数据量比较大的场合。通常,我们所学习的归并排序算法都是二路归...
  • mitedu
  • mitedu
  • 2009年02月12日 16:22
  • 2922

[STL] List 中sort为什么采用归并排序

这几天在看STL(SGI版本----侯捷),在看完第一章后有点懵,但还是很震撼,STL的设计理念确实很好,至于有多么好我们都懂,所以就不再评价了。      由于刚刚开始看,所以有些东西并不是很透彻,...
  • zr1076311296
  • zr1076311296
  • 2016年05月22日 19:07
  • 802

归并排序(视频+详解+代码)

归并排序 概述:归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到...
  • dreamzuora
  • dreamzuora
  • 2016年10月16日 15:38
  • 988

归并排序算法解析

归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。 一次归并算法 1、基本思路 ...
  • yousir1988
  • yousir1988
  • 2012年06月25日 17:38
  • 5485

【排序】归并排序(递归和非递归版本)

#include using namespace std; void merge(int* a, int* temp, int begin, int middle, int end){ int i...
  • ruan875417
  • ruan875417
  • 2016年05月14日 13:47
  • 811

归并排序——史上最详细图解教程!!!

题目大意:把n个数,分成若干份,然后每一份暴力排序一下,然后递归地合起来。 为什么要这样做?这样有个球用? 核心问题就在于,每两份之间你是怎么合起来的。 我们举个例子。 一个比较呆萌的思路...
  • qq_36523667
  • qq_36523667
  • 2017年11月29日 23:57
  • 243
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:泛型归并排序
举报原因:
原因补充:

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