【发布时间】:2011-07-25 09:12:59
【问题描述】:
我的快速排序不起作用。我特别不确定要传递给分区算法的内容以及如何管理枢轴,因为在一种情况下它成为头节点,在另一种情况下成为最后一个节点。我的方法基于数组的解决方案。这是我的尝试。有任何想法吗?请注意,选择分区算法是为了适应单向链表 (SLL) 的单向特性。
public static SLL quickSort(SLL list, SLLNode first, SLLNode last)
{
if (first != null && last != null)
{
SLLNode p = partition(list, first, last) ;
quickSort(list,first,p) ;
quickSort(list,p.succ, last) ;
}
return list ;
}
public static SLLNode partition(SLL list, SLLNode first, SLLNode last)
{
//last.succ = null ;
SLLNode p = first ;
SLLNode 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 ;
}
[编辑]
我想“就地”执行此操作
我正在寻求有关如何在此过程中管理头部和尾部的帮助。
除非我的方法不可能,否则请不要提出替代方案
【问题讨论】:
-
当您在调试器中单步执行代码时,您会看到什么?您可以拥有的最简单但不起作用的示例是什么?你能提供一个演示问题的单元测试吗?
-
您想要对单链表进行就地排序?这会很慢。如果你可以用一些内存来换取时间和清晰的算法,那么让分区实际上创建两个新的子列表,对它们进行递归排序并连接结果。
-
我认为“last.succ = null”会破坏链表。
-
@all, "last.succ = null" 现在被注释掉了——这只是我试图找到一种方法来处理传入的 head 和 last 的另一种尝试。
-
只是为了确定 - 是否有任何具体原因您没有使用更合适的算法,例如 Mergesort?
标签: java algorithm singly-linked-list