【发布时间】:2010-11-29 04:12:56
【问题描述】:
我正在尝试使用 Scala 编写耐心排序的简单实现。
我已经正确地创建了初始桩;但是,我使用优先级队列来简化输出列表的生成让我很头疼。
看来我的排序实现要么错误,要么被忽略:
def PileOrdering = new Ordering[Stack[A]] {
def compare(a : Stack[A], b : Stack[A]) = a.head.compare(b.head)
}
// Use a priority queue, ordering on stack heads (smallest stack elems)
val pq = new PriorityQueue[Stack[A]]()(PileOrdering)
// piles is a List[Stack[A]]
pq ++= piles
// Extract an ordered list of elements
val returnVal = (0 until count) map (_ => {
val smallestList = pq.dequeue
val smallestVal = smallestList.pop
if (smallestList.length > 0){
pq.enqueue(smallestList)
}
smallestVal
})
PriorityQueue 似乎是按(我想是默认的堆栈排序)堆栈大小排序的,而不是我的排序。
有什么明显错误的地方跳出来吗?
任何帮助都会受到极大的欢迎。
谢谢,
编辑:我在最初的问题中没有说清楚:我使用的是 Scala 2.8.1。
Edit2:我期待 returnVal包含从最小到最大的元素排序,通过从所有堆栈的头部获取最小元素来找到。 Daniel 指出,我的 Ordering 将从最大到最小的 Stacks 排序(堆栈本身已经正确排序,最小的元素在顶部),这似乎是问题所在。
【问题讨论】:
-
请提供可编译代码。这个不会编译,因为
A和count都是未知的。 -
是的,你是对的。我想这就是在凌晨提出问题的问题。我现在不在家,但稍后我会在我在家时编辑问题。
-
请明确
returnVal中的代码应该做什么——否则很难知道你的代码是否“错误”。 :-)
标签: scala priority-queue