【问题标题】:Is there a way to write Heap Sort Algorithm in SML using the Foldr or Foldl functions?有没有办法使用 Foldr 或 Foldl 函数在 SML 中编写堆排序算法?
【发布时间】:2014-04-17 01:24:23
【问题描述】:

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

【问题讨论】:

  • 这没有意义。折叠用于在迭代列表时累积值。这就是堆排序的工作方式。在 heapsort 中,您取出所有元素,将它们组成一个堆,然后从堆中一个一个地提取元素。
  • 好吧,一旦你创建了堆,你就可以对堆中的数据进行排序,这就是堆排序。这是维基百科页面:en.wikipedia.org/wiki/Heapsort。所以我的问题是你将如何获取堆并将排序算法应用于该堆以对其进行排序?
  • 对。但是你在这里迭代什么列表?您正在取出一个堆并反复从中取出一个元素以形成一个列表,因此它是展开。

标签: algorithm sorting functional-programming sml smlnj


【解决方案1】:

维基百科文章描述的堆排序分两个阶段工作。首先,它将数组重新排列成一个 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 在这里如何为您提供帮助。

【讨论】:

  • 好的,所以您几乎不能使用 foldl 或 foldr 在 SML 中编写“筛选”算法。非常感谢。
猜你喜欢
  • 2014-04-17
  • 2011-09-04
  • 2017-01-25
  • 2021-02-07
  • 1970-01-01
  • 2017-12-24
  • 1970-01-01
  • 1970-01-01
  • 2018-08-16
相关资源
最近更新 更多