std :: list.sort()的效率很高

时间:2013-04-22 17:29:53

标签: c++ list sorting stl linked-list

好的,以下是:

我想使用双链表并希望对其中的对象进行排序。对象属于另一类。奇怪的是:当我使用我自己创建的双链表时,我在将它们添加到列表时对元素进行排序。这就像插入排序,效率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);
        }
    }
};

1 个答案:

答案 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::vectorstd::sort代替std::liststd::list::sort会提供更快的结果。


如果您的问题是“为什么手写版本更快?”,这取决于您的输入。对于某些输入,插入排序可以是O(n)。 (对于您的实现,当以相反的顺序插入元素时会发生这种情况)