我想知道是否有办法使用SML的Foldr或Foldl函数编写堆排序算法。我无法在网上找到一个例子,我想知道是否有人可以就此事给我一些指导。我想使用更高阶函数和最小递归来实现排序算法。但是我不知道从哪里开始。
答案 0 :(得分:2)
维基百科文章描述的Heapsort分两个阶段进行。首先,它将数组重新排列为Max-heap,最大项目位于0,其余项目排列成有效堆。
下一步是通过在数组末尾连续交换最大项目来减少计数,并将新项目筛回到堆中来对堆进行排序。花点时间在维基百科页面上观看动画GIF示例。
排序阶段是这样的:
last_item = array.Length - 1
while (last_item > 0)
{
// move largest item to the end of the array
// and replace with the item that was at the end
swap(0, last_item)
// decrease the count,
// and sift the item down to its proper place
--last_item
sift_down(0, last_item)
}
完成后,数组按升序排列。
我看不出foldl
或foldr
如何帮助您。