具有一个递归函数和foldBack函数的插入排序实现

时间:2012-03-01 15:23:31

标签: list f# insertion-sort

我正在审查一些基本数据结构的实现以及对它们进行操作的算法。我想插入排序的惯用F#代码非常像:

let rec insert x = function
  | [] -> [x]
  | y::ys -> if x<=y then x::y::ys
             else y::(insert x ys)

and insertionSort = function
  | [] -> []
  | x::xs -> insert x (insertionSort xs)

let myLst = [8;3;3;5;-6;0;1;4;-3;2]
let result = myLst |> insertionSort 

val结果:int list = [-6; -3; 0; 1; 2; 3; 3; 4; 5; 8]

虽然我试图用 List.foldBack 来实现它,并且只有一个递归函数,如下所示,并且无法给我正确的结果?任何人都可以找出问题所在?

let rec anotherInsertionSort lst =
  List.foldBack(fun x (ys:list<_>) -> 
                  if ys.IsEmpty then [x]
                  elif x <= ys.Head then x::ys
                  else ys.Head::x::anotherInsertionSort ys.Tail) lst []

2 个答案:

答案 0 :(得分:3)

cfern's code取消高尔夫球:

let rec insert i = function
  | h::t -> min h i::(insert (max h i) t)
  | _ -> [i]

let insertionSort l = List.foldBack insert l []

答案 1 :(得分:2)

正如我在评论中所说,问题是你在x分支机构中放弃了else。这是修复它的一种方法:

let rec anotherInsertionSort lst = 
    List.foldBack(fun x ys ->  
                    match ys with
                    | [] -> [x]
                    | y::_ when x <= y -> x::ys 
                    | y::ys -> y::(anotherInsertionSort (x::ys))) lst [] 

话虽如此,我更喜欢Daniel的方法。