将项目插入链接列表后是否排序? 我有一个C++程序,把节点插入链表。节点由一个我们将调用数据的字符串和一个指向下一个我们将调用的节点的指针组成。此外,head节点将被定义为head

将项目插入链接列表后是否排序? 我有一个C++程序,把节点插入链表。节点由一个我们将调用数据的字符串和一个指向下一个我们将调用的节点的指针组成。此外,head节点将被定义为head,c++,sorting,linked-list,C++,Sorting,Linked List,我不知道什么更有效- 1.在我的列表中插入一组字符串,然后对其进行排序 2.或者在插入时对列表进行排序 我认为是后者,我想知道我将如何着手实现这样的东西 我想知道实现这样一个函数的最简单方法。我认为这实际上与如何执行没有关系,当您在插入时进行排序时,插入上会有O(n),因为您可能需要遍历整个列表才能找到正确的插入点 但是,当您将所有项目添加到列表中后进行排序时,您还将至少有O(n)在列表中移动项目。我认为这实际上与您如何进行排序没有关系,当您在插入时进行排序时,插入上将有O(n),因为您可能必须

我不知道什么更有效- 1.在我的列表中插入一组字符串,然后对其进行排序 2.或者在插入时对列表进行排序

我认为是后者,我想知道我将如何着手实现这样的东西


我想知道实现这样一个函数的最简单方法。

我认为这实际上与如何执行没有关系,当您在插入时进行排序时,插入上会有O(n),因为您可能需要遍历整个列表才能找到正确的插入点


但是,当您将所有项目添加到列表中后进行排序时,您还将至少有O(n)在列表中移动项目。

我认为这实际上与您如何进行排序没有关系,当您在插入时进行排序时,插入上将有O(n),因为您可能必须遍历整个列表才能找到正确的插入位置


但是,当您在将所有项目添加到列表后进行排序时,您至少还有O(n)可以在列表中移动项目。

我回答了一个类似的问题(99%相似:)

现在我想是整数,对于字符串,可以使用C库提供的
std::string compare
函数或
strcmp
进行比较

根据我的意见和其他答案,您的应用程序(如果需要排序的链表)最好在插入时对数据进行排序。
我回答了一个类似的问题(99%相似:)

现在我想是整数,对于字符串,可以使用C库提供的
std::string compare
函数或
strcmp
进行比较

根据我的意见和其他答案,您的应用程序(如果需要排序的链表)最好在插入时对数据进行排序。
第一种解决方案:插入未排序的k个元素,只需将它们插入开头,每个元素都是O(1)。还有一种排序:
O(nlogn)
在这些k元素之后。你得到的时间是O(nlogn+k)/k=O(n(logn/k))

第二种解决方案:将元素按排序顺序插入列表是
O(n)
,因为您需要找到列表中的位置。对于k次插入,它将是
O(n*k)
,并摊销
O(n*k/k)=O(n)

因此,对于
logn
,第一种解决方案更好,对于
logn>k


为了提高效率,您可能需要一个排序的数据结构来访问O(logn)中的元素,例如a[基本上是链表的一种变体,带有附加信息以便于访问]或第一种解决方案:插入未排序的k个元素,只需将它们插入到开头,每个元素都是O(1)。还有一种排序:
O(nlogn)
在这些k元素之后。你得到的时间是O(nlogn+k)/k=O(n(logn/k))

第二种解决方案:将元素按排序顺序插入列表是
O(n)
,因为您需要找到列表中的位置。对于k次插入,它将是
O(n*k)
,并摊销
O(n*k/k)=O(n)

因此,对于
logn
,第一种解决方案更好,对于
logn>k


<>为了更好的效率,您可能需要一个排序的数据结构,它访问O(Logn)中的元素(如基本上是一个链表的变体,它具有附加信息以便于访问)或一个

最简单的解决方案是使用C++提供的代码。
#include <list>
#include <algorithm>
#include <iostream>
#include <string>

class Node {
public:
    Node(const std::string& data) : Data(data) {
    }
    std::string Data;
};

bool NodeLess(const Node& n1, const Node& n2) {
    return n1.Data < n2.Data;
}

void main() {

    std::list<Node> l;
    l.push_back(Node("d"));
    l.push_back(Node("c"));
    l.push_back(Node("a"));
    l.push_back(Node("b"));

    l.sort(NodeLess);

    for (auto i = l.begin(); i != l.end(); ++i)
        std::cout << i->Data.c_str() << " ";

}
#包括

最简单的解决方案是使用C++提供的代码。<代码> STD::列表< /C>和<代码> STD:::排序:< /C> >:

#include <list>
#include <algorithm>
#include <iostream>
#include <string>

class Node {
public:
    Node(const std::string& data) : Data(data) {
    }
    std::string Data;
};

bool NodeLess(const Node& n1, const Node& n2) {
    return n1.Data < n2.Data;
}

void main() {

    std::list<Node> l;
    l.push_back(Node("d"));
    l.push_back(Node("c"));
    l.push_back(Node("a"));
    l.push_back(Node("b"));

    l.sort(NodeLess);

    for (auto i = l.begin(); i != l.end(); ++i)
        std::cout << i->Data.c_str() << " ";

}
#包括

#包含和在链接列表上。

抱歉,不知道如何在链接列表上进行排序[
O(n log n)
?@TonyTheLion:将其转换为数组[
O(n)
]排序[
O(nlogn)
]从该数组创建列表[
O(n)
]您也可以直接在链接列表上使用快速排序。抱歉,不知道链表上的排序如何
O(n log n)
?@TonyTheLion:将其转换为数组[
O(n)
]排序[
O(nlogn)
]从此数组创建列表[
O(n)
]你也可以直接在链表上使用QueQuoT。如果你要使用<代码> STD::列表,那么你应该考虑使用<代码>列表::排序成员函数。当然,我想看看哪个应用程序更好。@blastfurny我完全忘记了
std::list::sort
,谢谢你提醒我!相应地编辑了答案。如果你要使用<代码> STD::列表,那么你应该考虑使用<代码>列表::排序成员函数。当然,我想看看哪个应用程序更好。@blastfurny我完全忘记了
std::list::sort
,谢谢你提醒我!相应地编辑了答案。我无法使你的方法起作用。在一行中,您只需要临时->数据;这应该是temp->data=data;?不管怎样,我都不能让它正常工作。我会努力找出我做错了什么,然后带着结果回来。谢谢:D@chickeneaterguy:html标记一定有问题。即使在一年之后,我在用html:)编写“>”时仍有问题。谢谢。我使用了不同的方法,但你的方法最有帮助。我无法让你的方法发挥作用。在一行中,您只需要临时->数据;这应该是temp->data=data;?不管怎样,我都不能让它正常工作。我会努力找出我做错了什么,然后带着结果回来。谢谢:D@chickeneaterguy:html标记一定有问题。即使在一年之后,我在用html:)编写“>”时仍有问题。谢谢。我用了不同的方法,但你的