使用向量的选择排序算法
Posted
技术标签:
【中文标题】使用向量的选择排序算法【英文标题】: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 < 30; ++pos)
,然后你正在访问tosort[30]
?
参见this Q&A 了解使用迭代器的 STL 风格 selection_sort
嗯,我不知道我是怎么把 30 放在那里的。我觉得自己像个白痴。感谢您指出我的愚蠢事故
很好的问题:“当它说 X 时,编译器/运行时是什么意思?”很好的问题:“为什么这个(非常非常短;即 10 行或更少)专门为 SO 编写的代码示例会生成错误 X?”非常糟糕的问题:“我在这乱七八糟的代码中遇到运行时错误 X,请帮我调试一下”
【参考方案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
,因为这可能会导致稍后出现错误。
【讨论】:
以上是关于使用向量的选择排序算法的主要内容,如果未能解决你的问题,请参考以下文章