排序Bool数组

时间:2017-02-04 20:40:17

标签: arrays sorting swift3 boolean

我有一系列布尔人,我想分类:

var array = [true,false,true,false]

我不确定如何使用排序方法:

playersArray.sorted(by: (Bool, Bool) -> Bool)

提前致谢

2 个答案:

答案 0 :(得分:2)

方法1:使用sorted使用最小闭包

如果您要使用sorted,并且希望true成为第一个,则可以将其写为:

let sorted = array.sorted { $0 && !$1 }

<强>解释

您提供给sorted的关闭需要2 Bool并返回Bool。根据您提供的闭包,这是一个表格,将2 Bool的输入映射到所需的输出:

input            desired answer
-------------    --------------
false < true     false
true  < false    true
false < false    false
true  < true     false

由于您希望true首先出现在您的数组中,然后true < falsefalse > true

因此,当第一个输入为true且第二个输入为false时,您希望返回true。这可以简单地写成{ $0 && !$1 }

方法2:基数排序

由于只有2个值,因此只计算其中一个值然后创建一个具有正确数量的true s和false s的数组会更有效。这将以线性时间O(n)运行,这比对大型数组的排序要快。

let trueCount = array.reduce(0) { $0 + ($1 ? 1 : 0) }
let sorted = Array(repeating: true, count: trueCount) +
             Array(repeating: false, count: array.count - trueCount)

效果比较

以下是在2.4GHz i5 MacBook Pro上运行的10,000元素阵列上的3种方法的比较。这是在发布模式下编译的:

sorting function          time for 100 runs (seconds)
----------------          --------------
Your answer               0.44872701
Method 1                  0.18970698
Method 2                  0.00229198

基数排序方法大约快82倍。

答案 1 :(得分:0)

得到了它!

array.sorted {$0.description > $1.description}