【发布时间】:2020-02-22 15:12:11
【问题描述】:
这可能是一个不好的问题,但我很好奇。
我在网上学习了一些数据结构和算法课程,我遇到了诸如选择排序、插入排序、冒泡排序、归并排序、快速排序、堆排序等算法。它们几乎从来没有接近过 O(n)当数组被反向排序时。
我在想一件事:为什么我们不使用空间来换取时间?
当我整理一些东西时,我会拿起一个,放在它所属的地方。所以我想如果我们有一个项目数组,我们可以将每个值放入具有该值的索引中。
这是我在 Swift 4 中的实现:
let simpleArray = [5,8,3,2,1,9,4,7,0]
let maxSpace = 20
func spaceSort(array: [Int]) -> [Int] {
guard array.count > 1 else {
return array
}
var realResult = [Int]()
var result = Array<Int>(repeating: -1, count: maxSpace)
for i in 0..<array.count{
if(result[array[i]] != array[i]){
result[array[i]] = array[i]
}
}
for i in 0..<result.count{
if(result[i] != -1){
realResult.append(i)
}
}
return realResult
}
var spaceSorted = [Int]()
var execTime = BenchTimer.measureBlock {
spaceSorted = spaceSort(array: simpleArray)
}
print("Average execution time for simple array: \(execTime)")
print(spaceSorted)
我得到的结果:
这种排序算法是否已经存在?
这是一个坏主意,因为它只需要唯一值并丢失重复项吗?或者它有什么用处?
为什么我不能使用 Int.max 作为 maxSpace?
编辑: 我收到以下错误
错误:执行被中断。
当我使用 let maxSpace = Int.max
MyPlayground(6961,0x7000024af000) malloc:检测到堆损坏, 空闲列表在 0x600003b7ebc0 处损坏 * 不正确的保护值:0 MyPlayground(6961,0x7000024af000) malloc: * 在 malloc_error_break 中设置断点进行调试
感谢您的回答
【问题讨论】:
-
你有什么错误吗?
-
@Jok3r 是的,请看我的编辑。
-
考虑需要为大小为 2^63 的数组分配的内存量。一个快速的谷歌给了我 7400 万太字节......
-
@Sweeper 你是对的,只是认为我使用的不是 Array 可以拥有的最大索引,而是 Int 可以拥有的。
标签: swift algorithm sorting int big-o