【问题标题】:Does this sorting algorithm exist? (implemented in Swift)这种排序算法存在吗? (在 Swift 中实现)
【发布时间】: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


【解决方案1】:

这是基数排序的极端版本​​。引用自Wikipedia:

基数排序是一种非比较排序算法。它通过根据基数创建元素并将其分配到存储桶中来避免比较。对于具有多个有效数字的元素,对每个数字重复此分桶过程,同时保留前一步的顺序,直到所有数字都被考虑在内。因此,基数排序也被称为桶排序和数字排序。

在这种情况下,您将基数选择为maxSpace,因此您没有任何“具有多于一位有效数字的元素”(来自上面的引用)。

现在,如果您使用 Hash Set 数据结构而不是数组,您实际上不需要真正分配整个范围的空间。你仍然会保留所有的循环迭代(从 0 到 maxSpace),它会检查散列集是否包含 i 的值(循环变量),如果是,输出它.

只有当maxSpace 的数量级与输入数组中的元素数量相同时,这才是一种有效的算法。其他排序算法可以以 O(nlogn) 时间复杂度进行排序,因此对于 maxSpace 远大于 nlogn 的情况,该算法并不那么引人注目。

【讨论】:

    猜你喜欢
    • 2018-12-08
    • 2012-11-07
    • 1970-01-01
    • 1970-01-01
    • 2019-01-29
    • 1970-01-01
    • 1970-01-01
    • 2021-09-01
    • 1970-01-01
    相关资源
    最近更新 更多