#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++泛型实现,对于学习排序算法以及c++泛型编程都是很好的材料
支持任意类型数据的排序,采用5中排序算法冒泡排序,选择,插入,快速,堆排序。
插入排序 插入排序改进 高级排序算法 归并排序 归并排序改进 归并排序自底向上 快速排序 随机化快速排序 双路快速排序 三路快速排序 堆和堆排序 堆的基本存储 ShiftUp ShiftDown 基础堆排序和Heapify 优化的堆排序 ...
采用四种排序算法——直接插入排序、直接选择排序、冒泡排序和快速排序,四种排序并发运行,因而在排序数据量较大的情况下可以直观体现四种排序算法之间的性能差异; 3. 排序元素输入有三种方式:1)手动输入;2)...
Java常用排序算法源码 稳定:冒泡排序、插入排序、归并排序和基数排序;不稳定:选择排序、快速排序、希尔排序、堆排序
1、插入排序(InsertSort) 2、冒泡排序(BubbleSort) 3、选择排序(SelectSort) 4、快速排序(QuickSort) 5、希尔排序(ShellSort) 6、计数排序(CountSort) 7、堆排序(HeapSort) 8、归并排序(MergeSort) ...
java泛型实现复杂度为n^2的选择排序,冒泡排序和插入排序。
二叉查找树的插入、删除、遍历和查找等操作的C++实现,二叉查找树采用泛型结构
您可以选择许多排序例程,包括: Timsort(稳定) 快速排序合并排序(稳定) 就地归并排序(不稳定) Shellsort 二进制插入排序堆排序选择排序(实际上仅是为了进行比较) 圣杯排序(稳定) 基于 。 感谢Andrey ...
堆6.6 左式堆6.6.1 左式堆性质6.6.2 左式堆操作6.7 斜堆6.8 二项队列6.8.1 二项队列结构6.8.2 二项队列操作6.8.3 二项队列的实现6.9 标准库中的优先队列小结练习参考文献第7章 排序7.1 预备知识7.2 插入排序7.2.1...
练习 参考文献第7章 排序 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.1 预备知识 7.2 插入排序 7.2.1 算法 7.2.2 插入排序的分析 7.3 一些简单排序算法的下界 7.4 希尔排序 7.5 堆排序 7.6 归并排序 7.7 快速排序 7.7.1 选取枢纽元 ...
堆6.6 左式堆6.6.1 左式堆性质6.6.2 左式堆操作6.7 斜堆6.8 二项队列6.8.1 二项队列结构6.8.2 二项队列操作6.8.3 二项队列的实现6.9 标准库中的优先队列小结练习参考文献第7章 排序7.1 预备知识7.2 插入排序7.2.1 ...
堆6.6 左式堆6.6.1 左式堆性质6.6.2 左式堆操作6.7 斜堆6.8 二项队列6.8.1 二项队列结构6.8.2 二项队列操作6.8.3 二项队列的实现6.9 标准库中的优先队列小结练习参考文献第7章 排序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 实际的快速排序例程 7.7.5 快速排序的分析 7.7.6 选择...
选择排序、二分法、插入法、泛型实现、图形化界面demo