【问题标题】:selection sort algorithm using vectors [closed]使用向量的选择排序算法
【发布时间】:2014-05-13 19:49:40
【问题描述】:

我正在尝试让选择排序与向量一起使用。我运行程序,它执行了未排序的第一部分,但随后显示表达式:向量下标超出范围。不知道是什么原因造成的。

#include <iostream> 
#include <vector> 
using namespace std; 

template<typename Comparable> 
void selectionSort(vector<Comparable> & toSort) 
{
    int pos, min, i;

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

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

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

        }
    }
}

int main(int argc, const char * argv[]) 
{ 
    const int NUM_ITEMS = 5; 
    int array[NUM_ITEMS] = { 16, 271, 77, 40, 120 }; 
    vector<int> sortingVector; 


    for(int i=0;i<NUM_ITEMS;i++) { 
        sortingVector.push_back(array[i]); 
    } 

    cout << "Before sort \n"; 

    for(int i=0;i<NUM_ITEMS;i++) { 
        cout << sortingVector[i] << "\n"; 
    } 

    selectionSort(sortingVector); 

    cout << "After sort \n"; 

    for(int i=0;i<NUM_ITEMS;i++) { 
        cout << sortingVector[i] << "\n"; 
    } 
    system("pause");
    return 0; 
}

【问题讨论】:

  • 您的向量大小为 5,您将其视为大小为 31。
  • 你是说你没看到这个? for( pos = 0; pos &lt; 30; ++pos),然后你正在访问tosort[30]
  • 参见this Q&A 了解使用迭代器的 STL 风格 selection_sort
  • 嗯,我不知道我是怎么把 30 放在那里的。我觉得自己像个白痴。感谢您指出我的愚蠢事故
  • 很好的问题:“当它说 X 时,编译器/运行时是什么意思?”很好的问题:“为什么这个(非常非常短;即 10 行或更少)专门为 SO 编写的代码示例会生成错误 X?”非常糟糕的问题:“我在这乱七八糟的代码中遇到运行时错误 X,请帮我调试一下”

标签: c++ sorting vector selection-sort


【解决方案1】:

没有人知道这个神奇的数字 30 在你的函数中意味着什么

template<typename Comparable> 
void selectionSort(vector<Comparable> & toSort) 
{
    int pos, min, i;

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

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

甚至函数本身也不知道这个神奇的数字 30 是什么意思。

如果您使用的是标准容器std::vector,那么它有成员函数size,可以随时报告容器中有多少元素。

在任何情况下,如果您使用 size() 而不是 30,则代码无效,因为内部循环将访问位置等于 size() 的元素

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

我觉得应该有

for( i = pos + 1; i < toSor.size(); ++i)

这个条件

if( min != pos)

也是无效的,因为您正在比较不同的实体。

函数可以这样定义

template<typename Comparable> 
void selectionSort( std::vector<Comparable> & toSort ) 
{
    for ( std::vector<Comparable>::size_type pos = 0; pos < toSort.size(); ++pos )
    {
        std::vector<Comparable>::size_type min = pos;

        for ( std::vector<Comparable>::size_type i = pos + 1; i < toSort.size(); ++i )
        {   
            if ( toSort[i] < toSort[min] ) min = i;
        }

        if ( min != pos )
        {   
            std::swap( toSort[min], toSort[pos] );
        }
    }
}

【讨论】:

  • 我把它改成了 5,就像它应该的那样。我不知道我从哪里得到的 30..但我仍然得到一个错误
  • @user3424390:你知道std::vector 知道它包含多少个元素吗?使用toSort.size()
  • @user3424390 查看我更新的帖子。
  • 是什么让 min != pos) 无效?在那之后我只需要摆脱所有东西或用一些东西代替它吗?对不起,我是菜鸟
  • @user3424390 pos 是一个索引,而 min 是某个其他索引处的值。重新查看我的 uodated 帖子。
【解决方案2】:
for( pos = 0; pos < 30; ++pos)
{
    min = toSort[pos];

如果您必须以这种特定方式执行此操作,请考虑在排序函数中使用 NUM_ITEMS 作为范围检查,而不是使用 0 到 29。

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

尽管向量只有 5 个元素,但您在此处直接访问元素 30。请务必检查pos + 1,因为这可能会导致稍后出现错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-01
    • 2019-04-24
    相关资源
    最近更新 更多