插入排序问题?

时间:2014-02-25 15:06:58

标签: c++ sorting

我现在正在尝试不同的排序算法,以了解它们的工作原理。

我正在看这个:

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个问题:

  1. 撤消任何比较符号并不会将排序顺序更改为降序。
  2. 使用我自己的容器实现它时,它永远不会对最后一个元素进行排序。也许我没有知道Begin和End应该如何为容器工作?这就是我制作它们的方式:
  3. 如果我有一个具有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

2 个答案:

答案 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算法来测试容器。