使用向量的选择排序算法

selection sort algorithm using vectors

本文关键字:排序 算法 选择 向量      更新时间:2023-10-16

我正在尝试让选择排序与向量一起工作。我运行了这个程序,它完成了未排序的第一部分,但随后说表达式:矢量下标超出范围。无法找出原因。

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

没有人知道这个神奇的数字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((的元素

对于(i=toSort[pos+1];i<to Sort[30]

我认为应该有

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] );
        }
    }
}

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,因为这可能会在以后导致错误。