【发布时间】:2013-01-26 04:31:21
【问题描述】:
我正在努力实现一个快速排序功能来对单链表进行排序。我必须使用什么算法来完成这个?对于链表,每次比较都需要 O(N) 的最坏情况,而不是数组通常的 O(1)。那么最坏情况下的复杂度是多少呢?
总而言之,我需要对快速排序算法进行哪些修改才能获得最佳排序算法,以及算法的最坏情况复杂度是多少?
谢谢!
我在下面有一个实现:
public static SingleLinkedList quickSort(SingleLinkedList list, SLNode first, SLNode last)
{
if (first != null && last != null)
{
SLNode p = partition(list, first, last) ;
quickSort(list,first,p) ;
quickSort(list,p.succ, last) ;
}
return list ;
}
public static SLLNode partition(SinlgleLinkedList list, SLNode first, SLNode last)
{
SLNode p = first ;
SLNode ptr = p.succ ;
while (ptr!=null)
{
if (ptr.data.compareToIgnoreCase(p.data)<0)
{
String pivot = p.data ;
p.data = ptr.data ;
ptr.data = p.succ.data ;
p.succ.data = pivot ;
p = p.succ ;
}
ptr = ptr.succ ;
}
return p ;
}
【问题讨论】:
-
基本上,不要使用带有链表样式数据结构的快速排序。你想要合并排序。对于随机访问为 O(n) 的任何数据结构,快速排序总是表现不佳。
-
我特别想为学习目的实现快速排序。
-
你可以使用
qsort (x:xs) = qsort (filter (< x) xs) ++ [x] ++ qsort (filter (>= x) xs)算法虽然 some consider that it is not "true" quicksort 因为分区没有到位。 -
不要在节点之间移动数据,而是重新排列节点。分区时,从现有节点构建两个单独的列表,然后加入它们。
-
@Yuushi 请看下面的代码。小心,快速排序不需要一般的随机访问,所以它在链表上的性能很好。
标签: algorithm sorting linked-list quicksort