在读入矢量时排序

时间:2011-04-25 11:38:21

标签: c++ vector int

我需要读入10,000个整数的列表,并按升序将它们放在向量中。请注意,我不是在阅读然后排序,而是在阅读时对进行排序。

我这样做是为了学习练习。我意识到读取时的排序是O(n ^ 2),而读取然后排序可以是O(n +(n log(n)),快速排序或类似。

我在C数组中完成了这个,但是我在使用向量时遇到了麻烦。关于如何做到这一点的任何建议?

提前致谢!

编辑: C数组代码:

为了充分解释,我有两节课。 ArrayIntStorage和VectorIntStorage。

重点是这是一次学习练习。

这些类中的每一个都有一个_data成员变量,一个是int [],一个是向量 每个类都有一个读写方法,这是ArrayIntStorage的读取方法

void ArrayIntStorage::read(istream &sin)
{
string x;
sin >> x >> _numberOfInts;

_data = new int[_numberOfInts];

if(_sortRead)
{
    int i, j, index;
    sin >> _data[0];

    for(i = 1; i < _numberOfInts; i++)
    {
        sin >> index;

        j = i;
        while((j > 0) && (_data[j-1] > index))
        {
            _data[j] = _data[j - 1];
            --j;

        }
        _data[j] = index;
    }
}
else
{
    for(int i = 0; i < _numberOfInts; ++i)
    {
        sin >> _data[i];
    }
}   
}

3 个答案:

答案 0 :(得分:5)

示例时间:

std::vector<int> target;

// reading
std::ifstream file("integers.txt");
int number; 
while (file >> number) 
{
  target.insert(std::lower_bound(target.begin(), target.end(), number), number);
}

答案 1 :(得分:1)

我没有编译它,但也可以使用优先级队列

#include <queue>
#include <iostream>

    priority_queue<int> pq;
    // reading
    std::ifstream file("integers.txt");
    string line;
    while (getline(file, line))
    {
          int number = boost::lexical_cast<int>(line);

        pq.push (number);
    }

根据this question push()是O(log(N)),pop是O(2 * log(N))

答案 2 :(得分:1)

我会使用multiset为我做排序:

void VectorIntStorage::read(istream &sin) {
    multiset<int> ms;
    copy(istream_iterator<int>(sin), istream_iterator<int>(),
        inserter(ms, ms.end()));
    vector<int>(ms.begin(), ms.end()).swap(_data); 
}