有没有一种方法可以使用SML中提供的Foldl或Foldr方法来实现冒泡排序?任何指导都会有所帮助。
最佳答案
我刚刚在OCaml中编写了一个实现,以使我自己满意地演示了该技术。
我将排序过程分为两部分。一个是比较和交换函数,它通过fold_left(foldl)调用。此函数的类型(布尔值是此扫描是否发生交换):
bool * 'a list -> 'a -> bool * 'a list
每次运行时,它都会在适当的时候进行交换,在结果中建立一个新列表,该列表按与输入相反的顺序组成。 (由于foldl的从左到右,尾递归的行为,所以这是必需的。)它还跟踪在此列表扫描中是否进行了任何交换(这是必需的,因此我们知道何时停止排序)。
另一个功能是递归的,只是简单地一直调用扫描,直到不做任何更改为止。此函数还有一个布尔值,它会在每次调用时切换,以跟踪列表当前是否被反转。当发现在最新扫描中未进行任何交换时,它将返回结果列表。如果列表当前是反向的,那么它将在返回之前最后一次反向。
这是第二个函数的类型(此处的布尔值是列表当前是否被反向):
bool -> 'a list -> 'a list
同样有可能编写使用foldr的冒泡排序。它不会是尾递归的(因为不是foldr),并且由于它是从右到左扫描列表,因此您不必处理foldl的可逆问题。
关于sorting - 在SML中使用Foldl或Foldr编写气泡排序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22366583/