泛型插入排序

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

#pragma once

#include <iterator>

#include <functional>

 

 

   template< 

      class bidirectional_iterator,

      template<class> class greater_compare = std::greater

   >

   class insertion_sort_functor

   {

   public:

      bool operator()(bidirectional_iterator first, bidirectional_iterator last)const

      {

        typedef bidirectional_iterator::value_type value_type;

        typedef greater_compare<value_type> gc;

        gc gc_comparer;

 

        bidirectional_iterator j = next_iterator(first);

 

        for( ; j!=last ; ++j)

        {

           value_type key = *j;

 

           bidirectional_iterator i = last_iterator(j);

 

           while(std::distance(first,i)>0 && gc_comparer(*i,key) )

           {

              *next_iterator(i) = *i;

              --i;

           }

 

           if(i == first && gc_comparer(*i,key))

           {

              *next_iterator(i) = *i;

              *i = key;

              continue;

           }

 

           *next_iterator(i)= key;

        }

 

        return true;

      }

   private:

      bidirectional_iterator last_iterator(const bidirectional_iterator& i)const

      {

        bidirectional_iterator j(i);

        return --j;

      }

 

 

      bidirectional_iterator next_iterator(const bidirectional_iterator& i)const

      {

        bidirectional_iterator j(i);

        return ++j;

      }

   };

 

测试程序

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

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

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

 

      insertion_sort(a ,sizeof(a)/sizeof(int));

 

      insertion_sort_functor<vector<int>::iterator, std::less>()

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

 

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

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

 

 

C# .NET对通用泛型进行快速排序

我们经常使用List泛型进行数据的封装,但是有时候,在某种需求下,你可能需要对这个泛型进行排序,而排序规则是根据model中的某一个属性进行排序,这时棘手的事情来了,怎么办?!! 这个时候我们需要自...
  • qq415734794
  • qq415734794
  • 2012年08月17日 16:00
  • 2204

一步步地分析排序——插入排序

一步步地分析插入排序
  • u010707039
  • u010707039
  • 2016年09月28日 15:14
  • 1227

C++模板插入排序

插入排序的C++模板实现
  • zhangxiao93
  • zhangxiao93
  • 2016年03月07日 20:19
  • 551

插入排序复杂度为什么不是nlog(n)

插入排序是一种很基本的排序,其复杂度为O(n2)O(n^2),在大一学编程时没有多想,为什么不能利用二分查找改进为O(nlogn)呢O(n\log n)呢?问题描述:我们都知道插入排序就是在已有的序列...
  • q__y__L
  • q__y__L
  • 2016年12月21日 17:15
  • 758

数组插入排序

//中心思想: 在已经排好序 的元素之间插入一个元素,用这个新插入的元素与前面已经排好序的元素进行比较,小的或大的往前移。                     class    HomeWor...
  • cql_yao10k
  • cql_yao10k
  • 2016年11月07日 23:40
  • 603

单链表实现插入排序

//单链表实现插入排序,基本思想是先生成一个空链表,然后将待排序链表的结点依次插入 //这个空链表中,所有结点都插入完毕后,这个新生成的链表就是所需的有序链表 typedef struct node ...
  • Sun19910114
  • Sun19910114
  • 2014年08月22日 23:18
  • 1885

【算法】插入排序的递归实现

int data[10] = {5,4,3,6,7,8,56,3,234,2}; //输入元素为: data需要排序的数组 start需要排序的数组的起始下标 end需要排序的,无序序列的首元素的下标...
  • chenglibin1988
  • chenglibin1988
  • 2013年05月19日 15:07
  • 4113

插入排序的递归实现

#include void Insert(int *a,int n)//把数组a的第n个数插入前n-1个数中,注意前n-1个数已经是排好序的了 { int i=n-1;...
  • tzasd89812
  • tzasd89812
  • 2012年06月07日 21:42
  • 1639

插入排序及C语言实现

插入排序
  • bing_bing304
  • bing_bing304
  • 2014年10月28日 19:50
  • 6742

插入排序实例

public class InsertSort { public static void main(String[] args) { // TODO Auto-generated...
  • qq_22222499
  • qq_22222499
  • 2016年06月16日 20:59
  • 201
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:泛型插入排序
举报原因:
原因补充:

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