AlM*_*Mag 2 arrays sorting f# f#-interactive
我对F#interactive中的输出和Console上的输出之间的区别感到困惑.
问题概述:
给定长度为n的数组A按以下顺序对索引进行排序:
index[i] < index[j] if (A[i] < A[j]) or (A[i] = A[j] and i < j)
例如
[| 4; 2; 4; 2; 1; 1 |]
Run Code Online (Sandbox Code Playgroud)
这里的索引会像这样排序
[| 4; 5; 1; 3; 0; 2 |]
let GetSorted (A:int[]) =
let Comparer i j =
match (A.[i], A.[j]) with
| a1, a2 when a1 > a2 -> +1
| a1, a2 when a1 < a2 -> -1
| _, _ when i > j -> +1
| _, _ -> -1
let lenA = A |> Array.length
[| 0 .. lenA - 1 |] |> Array.sortWith Comparer
let A = [| 0; 0; 0; 0; 0; 0; 0; 0; 42; 0; 0; 0; 0; 0; 0; 0; 41 |]
let sortedPositions = GetSorted A
Run Code Online (Sandbox Code Playgroud)
当我在F#interactive中运行上面的脚本时,我得到以下内容:
val sortedPositions : int [] =
[|0; 1; 2; 3; 4; 5; 6; 7; 9; 10; 11; 12; 13; 14; 15; 16; 8|]
Run Code Online (Sandbox Code Playgroud)
注意,最后两个索引是16和8.这是正确的,因为41 <42
当我试图通过控制台运行时:
sortedPositions |> Array.iter(Console.WriteLine)
[|0; 1; 2; 3; 4; 5; 6; 7; 9; 10; 11; 12; 13; 14; 15; 8; 16|]
Run Code Online (Sandbox Code Playgroud)
我没有找到另一个数组的长度,因此两次运行会产生不同的结果,到目前为止只发现了17个.
为什么会这样?我有一个怀疑,在F#互动不同分类的作品,因为当你仔细看我的Comparer,它不处理好与同一指标正常的情况(虽然我不知道为什么排序算法需要检查相同的索引).所以,当我添加另一场比赛时
| _, _ when i = j -> 0
Run Code Online (Sandbox Code Playgroud)
它开始起作用了.但仍然,如果没有它我会得到不同的结果.
给John Palmer的评论+1.您的FSI会话可能受到您不记得自己创建的旧功能和值定义的污染,这些定义会产生干扰.
我可以确认这在FSI中完全相同并编译为控制台应用程序.尝试完全重置FSI会话并重新定义您的功能/值.
C:\Users\latkin\Source
> type .\test.fsx
let GetSorted (A:int[]) =
let Comparer i j =
match (A.[i], A.[j]) with
| a1, a2 when a1 > a2 -> +1
| a1, a2 when a1 < a2 -> -1
| _, _ when i > j -> +1
| _, _ -> -1
Array.init A.Length id |> Array.sortWith Comparer
[| 0; 0; 0; 0; 0; 0; 0; 0; 42; 0; 0; 0; 0; 0; 0; 0; 41 |]
|> GetSorted
|> printfn "%A"
C:\Users\latkin\Source
> & 'C:\Program Files (x86)\Microsoft SDKs\F#\4.0\Framework\v4.0\Fsc.exe' .\test.fsx
Microsoft (R) F# Compiler version 14.0.22416.0
Copyright (c) Microsoft Corporation. All Rights Reserved.
C:\Users\latkin\Source
> .\test.exe
[|0; 1; 2; 3; 4; 5; 6; 7; 9; 10; 11; 12; 13; 14; 15; 16; 8|]
C:\Users\latkin\Source
> & 'C:\Program Files (x86)\Microsoft SDKs\F#\4.0\Framework\v4.0\Fsi.exe' .\test.fsx
[|0; 1; 2; 3; 4; 5; 6; 7; 9; 10; 11; 12; 13; 14; 15; 16; 8|]
Run Code Online (Sandbox Code Playgroud)