【问题标题】: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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-07
      • 1970-01-01
      • 1970-01-01
      • 2015-11-22
      • 2017-03-30
      • 2011-12-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多