我现在正在尝试不同的排序算法,以了解它们的工作原理。
我正在看这个:
template< typename Iterator >
void insertion_sort( Iterator First, Iterator Last )
{
Iterator min = First;
for( Iterator i = First + 1; i < Last; ++i )
if ( *i < *min )
min = i;
std::iter_swap( First, min );
while( ++First < Last )
for( Iterator j = First; *j < *(j - 1); --j )
std::iter_swap( (j - 1), j );
}
它是插入排序,它将它们从最小到最大排序,但我有2个问题:
如果我有一个具有unsigned int大小和T *数据的动态数组容器,Begin返回一个迭代器,它有一个指向data [0]的指针,End返回一个带有指向data [size - 1]的指针的迭代器。如果我结束而不是返回data [size],它工作正常,但是如果大小等于分配的容量,那么会溢出缓冲区。那么所提出的插入排序算法是不正确的呢?我是从这个网站得到的:
http://en.wikibooks.org/wiki/Algorithm_Implementation/Sorting/Insertion_sort#C.2FC.2B.2B
答案 0 :(得分:3)
关于问题1:我认为如果你反转涉及解除引用的迭代器的所有比较符号,它应该有效,即替换
if ( *i < *min )
通过
if ( *i > *min )
(也可以用'max'替换名称'min',以避免混淆),
for( Iterator j = First; *j < *(j - 1); --j )
通过
for( Iterator j = First; *j > *(j - 1); --j )
这些是比较实际数据的比较。
关于问题2:通常,'end'迭代器指的是后面的位置要排序的最后一个实际项目。标准算法(例如你的)永远不会取消引用这个迭代器,因此不会发生溢出。
答案 1 :(得分:1)
指向end()的迭代器是一个超过最后一个元素的迭代器,所以你通常会循环遍历它们:
for(Iterator it = begin(); it != end(); ++it) ...
你的迭代器实现因此在最后一个之前停止并且是罪魁祸首。
不要一次测试所有内容,即使用自定义迭代器的自定义算法,这可能是个好主意。您可以使用stl容器来测试算法,使用stl算法来测试容器。