好的,以下是:
我想使用双链表并希望对其中的对象进行排序。对象属于另一类。奇怪的是:当我使用我自己创建的双链表时,我在将它们添加到列表时对元素进行排序。这就像插入排序,效率n ^ 2。
但这比使用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);
}
}
};
答案 0 :(得分:2)
您的手写排序函数具有O(N^2
)时间复杂度。插入每个元素(您调用addNode
n
次),并且需要n
个操作来查找插入点(给出n * n = n^2
)。
std::list<T>::sort()
需要具有O(n lg n
)复杂度,这比O(N^2
)快得多。 (lg n
的增长速度远远低于n
)
您手写的排序是insertion sort的变体。
请注意,对于大多数输入,使用std::vector
和std::sort
代替std::list
和std::list::sort
会提供更快的结果。
如果您的问题是“为什么手写版本更快?”,这取决于您的输入。对于某些输入,插入排序可以是O(n)
。 (对于您的实现,当以相反的顺序插入元素时会发生这种情况)