8
F#中最优雅的气泡排序方式是什么?什么是F#中最优雅的气泡排序方式?
UPDATE
如答案之一指出,泡沫排序不是在功能语言开始与高效。一个幽默而愤世嫉俗的评论者也指出,泡泡分类只适用于名单很小且无论如何都几乎分类的情况。因为我在过去使用C#,C++和Java EE进行了冒泡排序,并且由于我是F#中的一员,所以我很想知道如何在F#中编写巧妙的冒泡排序,新手。
F#中最优雅的气泡排序方式是什么?什么是F#中最优雅的气泡排序方式?
UPDATE
如答案之一指出,泡沫排序不是在功能语言开始与高效。一个幽默而愤世嫉俗的评论者也指出,泡泡分类只适用于名单很小且无论如何都几乎分类的情况。因为我在过去使用C#,C++和Java EE进行了冒泡排序,并且由于我是F#中的一员,所以我很想知道如何在F#中编写巧妙的冒泡排序,新手。
在函数式语言中使用冒泡排序并不是非常有效,因为实现必须多次颠倒列表(并且这对于不可变列表来说不能非常有效地实现)。
无论如何,从二郎的例子可以改写为F#像这样:
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
另一方面,可以实现使用可变阵列相同的算法。这将会更有效率,如果你愿意,你也可以在F#中使用数组。下面的函数创建数组的一个副本并对其进行排序。
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
托马斯
+1的幽默在同一个句子 – 2008-11-10 21:01:10
这就是我想用术语“优雅”和“冒泡排序”! – warren 2008-11-10 21:14:07