【发布时间】:2017-04-23 04:50:48
【问题描述】:
我一直在挑选和探索 Swift 标准库 sort() 函数的 Array 类型。令我惊讶的是,我注意到它在已经排序的数据上表现不佳。
对Int 的数组进行排序似乎比对已经排序的相同数组进行排序要快 5 倍。对一个随机对象数组进行排序比对已经按排序顺序排序的相同对象快约 4 倍(排序对象数组与 Int 数组使用不同的算法,我确信因此我对两者都进行了排序以消除偏差)。
这些是结果:
Shuffled Int array sort time: 1.3961209654808
Shuffled ColorObject array sort time: 3.14633798599243
NOnshuffled Int array sort time: 7.34714204072952
NOnshuffled ColorObject array sort time: 10.9310839772224
下面是我的代码供参考:
class ElapsedTimer {
let startTime: CFAbsoluteTime
var endTime: CFAbsoluteTime?
init() {
startTime = CFAbsoluteTimeGetCurrent()
}
func stop() -> CFAbsoluteTime {
endTime = CFAbsoluteTimeGetCurrent()
return duration!
}
var duration: CFAbsoluteTime? {
if let endTime = endTime {
return endTime - startTime
} else {
return nil
}
}
}
public class CountedColor {
public private(set) var count: Int
public private(set) var color: UIColor
public init(color: UIColor, colorCount: Int) {
self.count = colorCount
self.color = color
}
}
var distributedIntArray = [Int]()
for value in 1..<1000000 {
distributedIntArray.append(value)
}
var distributedCountedColorArray = distributedIntArray.map{ CountedColor(color: UIColor.white, colorCount: $0) }
distributedCountedColorArray.shuffle()
distributedIntArray.shuffle()
var timer = ElapsedTimer()
distributedIntArray.sort()
print("Shuffled Int array sort time: \(timer.stop())")
timer = ElapsedTimer()
distributedCountedColorArray.sort{ return $0.count < $1.count }
print("Shuffled Color array sort time: \(timer.stop())")
timer = ElapsedTimer()
distributedIntArray.sort()
print("NOnshuffled Int array sort time: \(timer.stop())")
timer = ElapsedTimer()
distributedCountedColorArray.sort{ return $0.count < $1.count }
print("Non shuffled Color array sort time: \(timer.stop())")
我的数组shuffle() 方法是从this post 中提取的。我的ElapsedTimer 只是简单地包装和使用CACurrentMediaTime() 函数。
我的问题是为什么我会看到这种行为?特别是当我对肯定应该使用通用排序的对象数组进行排序时。 swift使用什么样的通用排序算法?它肯定不可能是最坏情况和平均情况像 mergeSort 一样的情况。
【问题讨论】:
-
问“为什么” Swift 选择某个实现并不是一个好的客观问题——基本原理问题很少做,因为通常很难找到客观的支持证据。去掉多余的东西会使问题更整洁。客观问题是“Swift 使用什么排序算法?(可以预期什么性能(在 xyz 情况下)?)”
-
我相信问“为什么”是一个完全有效的问题。理解为什么选择一个实现同样重要,甚至更多,所有的决定都应该是合理的。话虽如此,我可以重新提出这个问题。
-
Swift 是开源的,所以如果你真的想知道他们使用的是什么排序算法,你为什么不去看看呢?至于您的实际问题,“为什么会”不适合 Stack Overflow;苹果为什么这么做或那是一个见仁见智的问题。
-
什么是
CountedColor? -
@YuchenZhong 让我编辑问题/代码 sn-p 以包含它
标签: arrays swift performance sorting time-complexity