合并F#中的排序代码而不是排序

时间:2017-11-01 13:32:20

标签: f#

我正在尝试编写合并排序代码。它的打印虽然没有排序。我能做错什么?

let rec mergePm xs ys =
    match (xs, ys) with
    | [], _ -> ys
    | _,[] -> xs
    | x::xs, y::ys ->
        if x < y then x :: mergePm xs (y::ys)
        else y :: mergePm (x::xs) ys

let rec msortPm xs =
    let sz = List.length xs
    if sz < 2 then xs
    else
        let n = sz / 2
        let ys = xs. [0..n-1]
        let zs = xs.[n..sz-1]
            in mergePm (msortPm ys) (msortPm zs)

printfn "%A" (msortPm[1,2,6,5])

1 个答案:

答案 0 :(得分:4)

您使用了错误的列表语法。

当您说[1,2,6,5]时,您并未列出四个元素的列表,而是列出一个一个元素,并且该元素是四个数字的元组。

在F#中,列表元素由新行或分号分隔。

这应该可以正常工作:

printfn "%A" (msortPm[1;2;6;5])

此外,我想指出List.length完整传递列表(因为F#列表是不可变的单链表),因此会减慢算法速度。最好在空列表和一个元素列表上进行模式匹配:

let rec msortPm xs = match xs with
    | [] | [_] -> xs
    | _ ->
        let n = sz / 2
        let ys = xs. [0..n-1]
        let zs = xs.[n..sz-1]
        mergePm (msortPm ys) (msortPm zs)

(另请注意in之后let在F#中是可选的