我对此有疑问;
我有这样的课
class myCLass {
private:
string name;
float value;
public:
float getValue();
};
我有超过 1,000,000 个对象,我必须根据其价值对这些项目进行排序。所以我创建了那个指针列表;
list<myClass *> objectList;
然后用超过 1.000.000 个对象填充它。现在您可以说如果您的对象小于 30-40 位,那么矢量是最好的方法,无论如何我创建它是绝对正确的;
bool ec(myClass *s1, myClass *s2)
{
return (s1->getValue() < s2->getValue());
}
然后在主函数中;
time = clock();
objectList.sort(ec); // Sort with STL.
time = clock() - time;
cout << ((float)time)/CLOCKS_PER_SEC << "\t:time to sort" << endl;
而且只需要1.2秒!这对我来说太不可思议了,记住它是最慢的列表容器可能是矢量可以更有效:) 无论如何我的问题是我写了一个插入排序和合并排序算法,如果有人使用我的排序算法,如果他/她想要缩短 100 万个对象需要 3 小时,是的 3 小时 :) 我想知道为什么它比它更多。而且我使用通用算法进行合并和插入,而不是不同的东西,它们计算出真实的结果。例如我的 insertSort() 就是这样;
void sort::insertionSort(list<myClass *> &normalList, list<myClass *> &sortedList){
list<myClass*>::iterator sortedIterator;
sortedList.clear();
iter = normalList.begin(); // iter describing on constructor
sortedList.push_back(*iter);
iter++;
for(; iter != normalList.end(); iter++){
sortedIterator = (--sortedList.end());
while( (*iter)->getValue() < (*sortedIterator)->getValue() && sortedIterator!=(--sortedList.begin() ) ){
sortedIterator--;
}
sortedList.insert(++sortedIterator,*iter);
}
}
我的插入排序()的基准表;
n=10 => 0 second;
n=100 => 0 second;
n=1.000 => 0 second;
n=10.000 => 0.96 second;
n=20.000 => 4.73 seconds;
n=50.000 => 34.22 seconds;
n=100.000 => 306.62 seconds
我无法控制超过 100.000 :)
那么这是正常的还是我搞错了?
注意:我尝试使用向量进行插入排序,对于 n=100.000,时间是 50 秒,所以尽管 n=100.000 不是 1.000.000,我仍然无法达到 1.29 秒 :)
注 2:这是 mergeSort() 的基准;
n=10 => 0 second;
n=100 => 0 second;
n=1.000 => 0.02 second;
n=10.000 => 0.8 second;
n=20.000 => 3.07 seconds;
n=50.000 => 21.7 seconds;
n=100.000 => 106.73 seconds