Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sorting 有序链表_Sorting_Linked List - Fatal编程技术网

Sorting 有序链表

Sorting 有序链表,sorting,linked-list,Sorting,Linked List,我想建立一个有序的链表 如果我在链接列表中插入项目时对其进行排序(即,参见下面的method#1),会更快吗?还是只插入所有项目,然后稍后对其进行排序会更快 方法#1 Rough pseudo - code: for each node in the list if newNode is greater than current node continue; else insert the node here; 方法#2 Insert all ite

我想建立一个有序的链表

如果我在链接列表中插入项目时对其进行排序(即,参见下面的
method#1
),会更快吗?还是只插入所有项目,然后稍后对其进行排序会更快

方法#1

Rough pseudo - code:
for each node in the list
    if newNode is greater than current node
       continue;
    else
       insert the node here;
方法#2

Insert all items.
Sort the list at the end (using QuickSort)

这在很大程度上取决于插入的数据。如果按大致降序添加节点,则显然在插入节点时对其进行排序会更快,但如果相反,则会更慢

这还取决于在完成排序时使用的排序算法

通常,在选择排序算法时,双链表有更多的选项

此外,在某些应用程序中,始终保持列表排序是可行的,这样您就可以随时查询它。如果您总是在列表的开头(或结尾)添加内容,那么每次添加内容时都必须对其重新排序


<>也有其他的结构,比如二叉树,它们保持自己的排序,在那里添加/查找一个节点的时间与树的大小成对数相关,而不是线性的(如链表)。p> 如果您选择第一个(添加时放置正确的空格)来查找合适的索引,则使用二进制搜索将花费O(logn)。考虑插入n个元素,你将得到O(n log n)时间。 在第二个选项中,插入O(n)的所有元素后,您将在O(n logn)时间内使用合并排序或快速排序对数组进行排序,这意味着O(n)+O(n logn)=O(n logn)


因此,它们的复杂性相同,但我更喜欢第一个,以避免额外的插入时间成本。

这取决于您使用的排序算法。它们都有不同的性能特征。按顺序插入新节点需要遍历已存在的节点,以找到每个新节点的插入点,但使用哈希算法或二叉树可以加快速度。同样,这也要视情况而定。但最后对列表进行排序是相当痛苦的(因为它是一个链表,而不是数组列表),这意味着必须取消节点链接并将其四处移动,不是吗?如果在插入节点时选择对节点进行排序,则必须至少断开一个链接才能插入每个新项目(除非在列表的开头或结尾插入)。