使用向量的选择排序算法

时间:2014-05-13 19:49:41

标签: c++ sorting vector selection-sort

我正在尝试将选择排序与向量一起使用。我运行该程序,它完成第一部分未分类但后面说表达式:向量下标超出范围。无法弄清楚造成它的原因。

#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; 
}

2 个答案:

答案 0 :(得分: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&lt; 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] );
        }
    }
}

答案 1 :(得分:0)

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

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

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

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