What is the most elegant way of bubble-sorting in F#?

冷暖自知 提交于 2020-01-03 08:25:20

问题


What is the most elegant way of bubble-sorting in F#?

UPDATE

As pointed out in one of the answers, bubble sorting isn't efficient in a functional language to begin with. A humourously-cynical commenter also pointed out that bubble sorting is only appropriate when the list is small and it's almost sorted anyway.

However, I'm curious to see how a clever bubble-sort can be written in F#, since I've done bubble sorts in C#, C++, and Java EE in the past, and since I'm an F# newbie.


回答1:


using bubble sort in a functional language isn't very efficient, because the implementation has to reverse the list many times (and this can't be really implemented very efficiently for immutable lists).

Anyway, the example from Erlang can be rewritten to F# like this:

let sort l = 
  let rec sortUtil acc rev l =
    match l, rev with
    | [], true -> acc |> List.rev
    | [], false -> acc |> List.rev |> sortUtil [] true
    | x::y::tl, _ when x > y -> sortUtil (y::acc) false (x::tl)
    | hd::tl, _ -> sortUtil (hd::acc) rev tl
  sortUtil [] true l

On the other side, you can implement the same algorithm using mutable arrays. This will be more efficient and in F# you can work with arrays too if you want. The following function creates a copy of the array and sorts it.

let sort (arr:'a[]) = 
  let arr = arr |> Array.copy
  let swap i j = let tmp = arr.[i] in arr.[i] <- arr.[j]; arr.[j] <- tmp
  for i = arr.Length - 1 downto 0 do
    for j = 1 to i do
      if (arr.[j - 1] > arr.[j]) then swap (j-1) j
  arr

Tomas




回答2:


F# is an impure language. Don't be puritanical about purity. Here is a simpler and more elegant impure bubblesort in F#:

let rec sort (a: int []) =
  let mutable fin = true
  for i in 0..a.Length-2 do
    if a.[i] > a.[i+1] then
      let t = a.[i]
      a.[i] <- a.[i+1]
      a.[i+1] <- t
      fin <- false
  if not fin then sort a


来源:https://stackoverflow.com/questions/279145/what-is-the-most-elegant-way-of-bubble-sorting-in-f

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!