#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());
分享到:
相关推荐
选择排序、插入排序和快速排序都是经典的排序算法,各有其特点和适用场景。接下来,我们将详细探讨这三个排序算法。 1. **选择排序(Selection Sort)** 选择排序是一种简单直观的排序算法。它的基本思想是在未...
C++作为一门强大且广泛应用的编程语言,其泛型编程能力使得我们可以编写出通用的排序算法,适用于不同类型的数据。以下是对"各种排序算法的C++泛型实现"这个主题的详细解析。 1. **C++ 泛型编程**: C++中的模板是...
本主题聚焦于三种常见的排序算法:插入排序、冒泡排序和快速排序,这些算法都已被实现为C++模板,使得可以应用于各种数据类型。 **插入排序(Insertion Sort)**是一种简单直观的排序算法,它的工作原理类似于我们...
值得注意的是,上述代码没有考虑优化措施,例如三数取中法选择枢轴,或者使用插入排序处理小规模数据等。这些优化可以进一步提升快速排序的性能,尤其是在处理已经部分有序的数据时。在实际项目中,为了提高算法效率...
本项目是一个小型的排序系统,其核心特点在于能够处理任意类型的数据,并且采用了五种不同的排序算法,包括冒泡排序、选择排序、插入排序、快速排序以及堆排序。下面将详细探讨这些知识点。 首先,**泛型**是Java...
6. **Collections**: 这是一个包含各种集合操作的工具类,如排序、查找、翻转等。提供的算法类包括`sort()`, `binarySearch()`, `reverse()`, `shuffle()`等。 泛型是Java中处理类型安全的一种方式,允许我们在类、...
3. **性能优化**:为了平衡排序和查找性能,实现可能会利用一些数据结构,比如平衡二叉搜索树,以确保高效的插入、删除和查找操作。 4. **遍历接口**:为了方便遍历排序后的元素,可能提供了`GetEnumerator()`方法...
- **数组的排序**:如果需要对泛型数组进行排序,可以利用Java的`Collections.sort()`方法(对于集合)或`Arrays.sort()`方法(对于数组),但需要注意,数组的元素必须实现了`Comparable`接口或提供自定义的`...
- **TreeMap**:有序映射,基于红黑树实现,键和值按照特定顺序排序。 在压缩包中的文件,如 `Test.java`、`HomeWork.java`、`HomeWork2.java` 和 `SimpleHomeWork.java`,可能是包含了使用泛型和容器的实例代码,...
集合框架与泛型是Java编程语言中的核心概念,它们极大地提高了代码的可读性、安全性和效率。在Java中,集合框架是一组接口和类,它们提供了存储和操作对象的统一方式。泛型则是Java 5引入的一个特性,用于在编译时...
### 集合与泛型知识点总结 #### 泛型概览 - **引入原因**:在Java 1.5及之后的版本中,引入了泛型这一特性,旨在提高集合类使用的安全性与灵活性。主要解决的问题包括: - **元素存储的安全性问题**:在非泛型...
在这里,我们将深入探讨MFC如何实现几种常见的排序算法:快速排序、冒泡排序、直接插入排序、直接选择排序以及折半插入排序。 1. **快速排序**: 快速排序是一种高效的分治算法,由C.A.R. Hoare在1960年提出。其...
TreeSet则按照元素的自然排序或比较器提供的排序进行排序,其内部基于TreeMap实现。 4. **泛型**:泛型允许我们在类、接口和方法中声明类型参数,从而创建可以处理多种类型的集合。例如,ArrayList中的E就是一个...
1. 插入(Insert):使用`save()`或`saveOrUpdate()`方法将实体对象持久化到数据库。 2. 更新(Update):通过`update()`方法更新已存在的实体对象。 3. 删除(Delete):使用`delete()`方法删除指定ID的实体对象。 ...
LinkedHashSet保持了元素的插入顺序,而TreeSet则按照元素的自然排序或自定义比较器进行排序。 **Queue**接口用于表示先进先出(FIFO)的数据结构,常用于队列操作。LinkedList可以作为Queue的实现,另外还有...
- **类型安全性**:泛型确保在编译时就能检查类型错误,防止不兼容类型的数据被插入到泛型容器中,从而提高了代码的稳定性。 - **性能提升**:由于泛型的类型信息在运行时可用,编译器能够生成更优化的IL代码,...
Java泛型是一种参数化类型机制,允许在编译时提供类型检查和消除类型转换。它主要用于集合框架中,以确保在编译期间元素类型的一致性。泛型类或接口中的类型参数,通常以字母如T(Type)表示。 泛型类的定义语法是...
【Java泛型单链表】是一种使用Java编程语言实现的数据结构,主要涉及到链表的创建、插入、删除等基本操作。在Java中,泛型允许我们编写可重用的代码,适用于多种数据类型,而无需进行重复的类型转换。在这个实现中,...