使用向量的选择排序算法

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 &lt; 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,因为这可能会导致稍后出现错误。

【讨论】:

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

向量排序算法,只对大于 0 的元素进行排序

3个向量的高效排序算法

向量篇_归并排序的实现及讨论

(内附抽奖)算法|排序算法-选择排序

一种算法,两种实现-选择排序

九种经典排序算法详解(冒泡排序,插入排序,选择排序,快速排序,归并排序,堆排序,计数排序,桶排序,基数排序)