有没有办法使用SML中提供的Foldl或Foldr方法实现冒泡排序?任何指导都会有所帮助。
答案 0 :(得分:1)
我刚刚在OCaml中编写了一个实现来演示我自己满意的技术。
我把排序过程分成两部分。一个是通过fold_left(foldl)调用的比较和交换函数。此函数具有类型(bool是否在此扫描中发生交换):
bool * 'a list -> 'a -> bool * 'a list
每次运行时,它会根据需要进行交换,在其结果中构建一个新列表,该列表以与输入相反的顺序组成。 (这是必要的,因为foldl的从左到右,尾递归行为。)它还跟踪在列表的此扫描中是否进行了交换(必要时我们知道何时停止排序)。
另一个函数是递归的,只是不停地调用扫描,直到没有进行任何更改。此函数还有一个布尔值,它在每次调用时切换以跟踪列表当前是否已反转。当它发现在最近的扫描中没有进行交换时,它将返回结果列表。如果列表当前被反转,那么它会在返回之前最后一次反转它。
这是第二个函数的类型(这里的bool是列表当前是否反转):
bool -> 'a list -> 'a list
同样可以编写使用foldr的冒泡排序。它不会被尾递归(因为foldr不是),并且因为它从右到左扫描列表,所以你不必处理你对foldl的逆转问题。< / p>
答案 1 :(得分:1)
我知道回答你的问题为时已晚,但希望这会有所帮助:
fun bsort [] = []
| bsort [x] = [x]
| bsort (x::y::xs) =
if(y<x) then
y::bsort(x::xs)
else
x::bsort(y::xs);
fun bubblesort [] = []
| bubblesort (x::xs) = bsort(x::(bubblesort(xs)));
请记住,我们必须进行冒泡排序,直到列表完全排序。