插入排序函数行为怪异 C++

Posted

技术标签:

【中文标题】插入排序函数行为怪异 C++【英文标题】:Insertion sort function acts weird C++ 【发布时间】:2018-11-13 15:26:14 【问题描述】:

我想创建一个函数来对随机数进行排序(使用另一个函数生成),我一直在尝试这样做一段时间,但没有任何效果。现在我有一个问题,有时我的程序编译时没有任何问题,有时它说“向量下标超出范围”,即使它编译正确,它也会以错误的顺序插入一些数字(尤其是当要排序的下一个数字小于前一个)。我尝试使用调试器并找出问题所在,但对我来说一切似乎都很好。你能这么好心并帮助我吗?非常感谢。

std::vector <int> insertion_sort(std::vector <int> generated)

    using namespace std;
    bool emplaced = false;
    vector <int> buffor(1);

    buffor[0] = generated[0];

    for (int i = 1; i < generated.size(); i++)
    
        emplaced = false;

        if (generated[i] >= buffor[i-1])
        
            buffor.push_back(generated[i]);
        
        else
        
            int x = 2;
            while (((i - x) > -1))
            
                if (emplaced == true)
                
                    break;
                

                if ((i - x) == 0)
                
                    buffor.emplace(buffor.begin(), generated[i]);
                    emplaced = true;
                

                if (generated[i] < bufor[i - x])
                

                
                else
                
                    buffor.emplace(buffor.begin() + (i-x), generated[i]);
                    emplaced == true;
                

                x++;
            
        

    

    return buffor;

【问题讨论】:

1) "vector subscript out of range" 不是编译错误。这很可能是运行时断言失败。 2) 请提供minimal reproducible example。 3) 您是否尝试过使用调试器单步执行您的代码? 顺便说一句,为什么不使用std::sort 我做到了,但我注意到的只是程序的排序数字小于已排序的数字(缓冲向量中的数字)。我必须创建自己的函数作为我的 IT 学习的练习。例如,如果输入(整数向量)是: 96 99 24 46 58 40 78 24 它显示: 78 78 46 78 46 78 24 78 46 78 24 96 99 58 40 24 但是如果输入是: 58 49 82 72 61 87 74 21 然后我得到“向量下标超出范围” 输入(整数向量)是:96 99 24 46 58 40 78 24 它显示:78 78 46 78 46 78 24 78 46 78 24 96 99 58 40 24 : 这是预期的结果吗?? 预期结果是 24 24 40 46 58 78 96 99 【参考方案1】:

插入排序是一种简单的排序算法,可以通过更紧凑的方式实现 和简单的代码如下:

DEMO is here.

std::vector<int> insertion_sort(const std::vector<int>& generated)

    auto shifted(generated);

    for (std::size_t j = 1; j < shifted.size(); ++j) 
    
        const auto temp = shifted[j];

        if(shifted[j-1] > temp)
        
            int i = j;

            do
                shifted[i] = shifted[i-1];
                --i;
             while(i > 0 && shifted[i-1] > temp);

            shifted[i]=temp;
        
    

    return shifted;    

【讨论】:

如果目标是以紧凑和直接的方式进行,最好使用emplace() 和适当的迭代器作为插入位置,让vector 进行移位。您可以使用std::find_if 为插入点找到合适的迭代器。或者更好的是,使用二分搜索。 @TypeIA 非常感谢。我也这么认为。由于这是一项 IT 研究,因此我避免使用诸如 std::find_if 或二分搜索之类的辅助算法。

以上是关于插入排序函数行为怪异 C++的主要内容,如果未能解决你的问题,请参考以下文章

1,排序算法

如何在c ++中计算冒泡排序、插入排序和选择排序函数的时间(以毫秒为单位)

C++编程基础题解:插入排序

C ++比较一个类中的函数怪异行为

结构-行为-样式-Js排序算法之 直接插入排序

如何在双向链表 C++ 上使用插入排序?