用向量实现选择排序

Posted

技术标签:

【中文标题】用向量实现选择排序【英文标题】:Implementing selection sort with vectors 【发布时间】:2012-02-08 19:16:18 【问题描述】:

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

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,或者我的选择排序是否写得不正确。我确信答案很简单,但我看不到。提前感谢您的帮助。

【问题讨论】:

为什么有时使用索引访问,有时使用at? (提示:不要使用后者。) 【参考方案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)

【讨论】:

也许把pos &lt; 30改成pos &lt; v.size() 谢谢你。我应该抓住这一点。有时我们会错过一些简单的事情。【参考方案2】:

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

【讨论】:

以上是关于用向量实现选择排序的主要内容,如果未能解决你的问题,请参考以下文章

使用向量的选择排序算法

用Java实现的选择排序和冒泡排序

用JAVA实现选择排序

用Go实现冒泡排序选择排序和快速排序的运行效率比较

C语言使用指针实现选择法排序。

java实现几种常用排序:选择排序