【问题标题】:F# sorting issueF# 排序问题
【发布时间】:2015-10-01 14:26:18
【问题描述】:
这段代码有什么问题?为什么不排序?
let rec sort = function
| [] -> []
| [x] -> [x]
| x1::x2::xs -> if x1 <= x2 then x1 :: sort (x2::xs)
else x2 :: sort (x1::xs)
假设采取
排序 [3;1;4;1;5;9;2;6;5];;
并返回:
验证它:int list = [1; 1个; 2; 3; 4; 5个; 5个; 6; 9]
【问题讨论】:
标签:
f#
functional-programming
【解决方案1】:
您的代码就像bubble sort 中的一个气泡循环。它会将最大元素带到最后一个位置,并将其他一些更大的元素放在右边。
请注意,您只遍历原始列表一次。它具有线性复杂度,我们都知道仅使用比较进行排序必须是 O(n*log n)。
如果您想对该列表进行排序,可以多次重复该循环。
【解决方案2】:
想想什么可以排在第一位……现在它只能是您列表中的第一位或第二位(最后一个案例中的if)
【解决方案3】:
let rec ssort = function
[] -> []
| x::xs ->
let min, rest =
List.fold_left (fun (min,acc) x ->
if h<min then (h, min::acc)
else (min, h::acc))
(x, []) xs
in min::ssort rest