有没有办法使用Foldr或Foldl函数在SML中编写堆排序算法?

时间:2014-03-12 17:36:00

标签: algorithm sorting functional-programming sml smlnj

我想知道是否有办法使用SML的Foldr或Foldl函数编写堆排序算法。我无法在网上找到一个例子,我想知道是否有人可以就此事给我一些指导。我想使用更高阶函数和最小递归来实现排序算法。但是我不知道从哪里开始。

1 个答案:

答案 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)
}

完成后,数组按升序排列。

我看不出foldlfoldr如何帮助您。