插入排序bizzare运行时间

时间:2016-11-26 22:02:01

标签: c++ loops vector runtime insertion-sort

我尝试使用插入排序对矢量进行排序,但对于大多数值,它无法完成。如果矢量大小大于3,则循环将不会在一段延长的时间内完成,或者根本不会完成,或者它将按预期快速完成,最多可以随机完成5个值。

#include <iostream>
#include <fstream>
#include <cstdlib>
#include <ctime>
#include <vector>

void PRINT(std::vector<int> &data);


void insertion(std::vector<int> data, clock_t Time);

int main()
{
    clock_t Time;
    int dataSize, maxval;
    std::vector<int> data;

    srand(time(0));


    std::cout<<"input vector size\n";
    std::cin>>dataSize;
    std::cout<<"input max value\n";
    std::cin>>maxval;

    Time=clock();
    for(int i=0; i<dataSize; i++)
    {
        data.push_back(1+rand()%maxval);
    }
    Time=clock()-Time;
    std::cout<<"ticks to randomize "<<Time<<" seconds "<<float(Time)/CLOCKS_PER_SEC<<std::endl;

    insertion(data, Time);
    return 0;
}

void PRINT(std::vector<int> &data)
{   
    std::cout<<"data contains: ";
    for(int i=0; i<data.size(); i++)
    std::cout<<data[i]<<", ";
    std::cout<<std::endl;
}


void insertion(std::vector<int> data, clock_t Time)
{
    bool sorted;    
    std::vector<int>::iterator j;

    Time=clock();
    for(int i=1; i<data.size(); i++)
    {   
        j=(data.begin()+i-1);
        sorted=false;

        while(!(j==data.begin())&&!sorted)
        {
            if (*j<data[i])
            {
                sorted=true;
                data.insert((j+1),data.at(i));
            }

            j--;
        }

    }
    Time=clock()-Time;

    std::cout<<"insertion:\nticks taken "<<Time<<"\n";
    std::cout<<"seconds "<<float(Time)/CLOCKS_PER_SEC<<std::endl;
    PRINT(data);
}

有没有人知道为什么我的实现在更高的值上有这么疯狂的运行时间?有没有更好的方法来实现这个?

1 个答案:

答案 0 :(得分:0)

这是一个明显的错误。

std::vector<int>::iterator j;
//...
for (int i = 1; i < data.size(); i++)
{
    j = (data.begin() + i - 1);  // iterator j points to a location in the vector
    //...
    while (!(j == data.begin()) && !sorted)
    {
       //...
       data.insert((j + 1), data.at(i));   // vector being resized here
     }
     j--;  // this iterator is now invalidated!

问题是你正在循环中间改变向量的大小,并且由于向量被调整大小,指向向量内的j迭代器变得无效。您尝试并减少无效迭代器,并且一切都从那里崩溃(在Visual Studio中运行显示一个调试消息框,迭代器是&#34;不可递减&#34;)。

使用整数(不是迭代器)直接索引,或者在我的注释链接中显示的实现插入排序的技术。