用向量实现选择排序

时间:2012-02-08 19:16:18

标签: c++ algorithm sorting vector

我正在尝试实现一个使用选择排序对随机生成的向量进行排序的函数。我正在尝试一种天真的方式,看看我是否能让它正常工作。这是我的尝试:

void selection_sort(std::vector<int>& v)
{
    int pos, min, i;
    //std::vector<int>::iterator pos, min, i;

    for( pos = v[0]; pos < v[30]; ++pos)
    {
        min = pos;

        for( i = v[pos + 1]; i < v[30]; ++i)
        {   
            if( i < min)
            {
                min = i;
            }
        }

        if( min != pos)
        {   
            std::swap(v.at(min), v.at(pos));

        }
    }
}

出于某种原因,当我再次显示向量时,所有元素的顺序与它们最初完全相同。我不确定我是否正确使用std::swap或者我的选择排序是否写得不正确。我确信答案很简单,但我看不出来。感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

你的问题是你试图将循环基于向量中的实际值,而不是向量中的索引。

因此,如果你的矢量是随机生成的,你会这样说:

for( pos = v[0]; pos < v[30]; ++pos)

v [0]的值有可能大于v [30]。因此循环永远不会运行。我在这个循环中看到了同样的问题:

for( i = v[pos + 1]; i < v[30]; ++i)

所以我建议使用索引进行实际循环。尝试类似:

for( pos = 0; pos < 30; ++pos)
{
  min = v[pos];

等...

编辑:如下所述,基于矢量大小的循环也是更好的选择。但是,为了避免每次循环运行时调用昂贵的size()方法,只需在循环开始之前获取大小。例如:

size_t size = v.size();
for(size_t pos = 0; pos < size; ++pos)

答案 1 :(得分:0)

您应该使用0pos+1v.size()作为for - 循环中的终点。