在SML中使用Foldl或Foldr编写冒泡排序

时间:2014-03-13 00:12:39

标签: sorting functional-programming sml bubble-sort smlnj

有没有办法使用SML中提供的Foldl或Foldr方法实现冒泡排序?任何指导都会有所帮助。

2 个答案:

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

请记住,我们必须进行冒泡排序,直到列表完全排序。