2012-02-08 66 views
1

我试图实现的排序使用选择排序随机生成的向量的函数。我正在尝试一种天真的方式,看看我能否正常工作。这里是我的尝试:实施选择排序与载体

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正确,或者如果我的选择排序是不正确写入我不知道。我相信答案非常简单,但我看不到它。感谢您的帮助提前。

+0

为什么你有时会使用索引访问,有时'at'? (提示:不要使用后者。) – 2012-02-08 19:57:11

回答

1

你的问题是,你试图基地附近的实际值的循环的载体,而不是在向量的索引。

所以,如果你的载体是随机生成的,你这样说:

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

有机会的话,在诉[0]值大于V [30]更大。因此循环将永远不会运行。我看到在这个循环相同的问题:

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

所以我建议使用实际循环索引。尝试是这样的:

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

等等

编辑:正如下面提到的,它也将是更好的基础你的矢量大小的循环。然而,为了节省你的自我从调用昂贵的大小()方法,每次循环运行时,只要抓住大小在循环开始之前。例如:

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

也许改变'POS <30'到'POS inf 2012-02-08 19:25:25

+0

感谢你为这个。我应该抓住这一点。有时候,我们错过了一些简单的事情。 – 2012-02-08 20:03:11

0

你应该在你for -loops使用0pos+1v.size()作为终点。