【发布时间】:2013-04-22 17:29:52
【问题描述】:
好的,下面是:
我想使用一个双链表并想对其中的对象进行排序。对象属于另一类。奇怪的是:当我使用自己创建的双链表时,我在将元素添加到列表的那一刻对它们进行排序。这就像插入排序,所以效率为 n^2。
但这比使用 std::list 排序要快得多,在 std::list 排序中,我将所有元素添加到列表中,然后调用 sort() 。我真的不明白为什么......
更多信息:在我排序〜500个元素的那一刻。
我对列表做错了吗?
编辑:一些代码
std::list 的代码
for every object:
list.push_back(object);
list.sort();
我的清单:
struct node{
someObject* data;
float depth;
node* prev;
node* next;
node(someObject* o){
data = o;
prev = NULL;
next = NULL;
depth = depthFunc(o);
}
float depthFunc(someObject* o);
};
struct myList{
node* head;
node* tail;
void insertAfter(node* toAdd, node* n);
void insertBefore(node* toAdd, node* n);
void addNode(someObject* o){
node* n = new node(o);
if (head == NULL) {
head = n;
tail = n;
} else {
node* temp = head;
while(temp != NULL && temp->depth < n->depth){
temp = temp->next;
}
if (temp != NULL) insertBefore(n, temp);
else insertAfter(n, tail);
}
}
};
【问题讨论】:
-
我猜你的 n^2 是最坏情况下的复杂度,如果幸运的话,根据数据(预排序)可能会更好
-
你如何衡量这个?
-
请提供SSCCE
-
并且在生成列表元素时插入它们有
O(N log N)比较,因为双向迭代器上的std::binary_search有O(log N)比较(你仍然有O(N^2)迭代器增量,但它们通常很多比比较便宜)。std::list::sort同样具有O(N log N)复杂性(比较计数)。因此,除非您向我们提供更多代码,否则我们只能猜测是什么解释了您的结果。 -
添加了一些简单的代码
标签: c++ list sorting stl linked-list