为啥选择排序的复杂度不是 n 阶乘?
Posted
技术标签:
【中文标题】为啥选择排序的复杂度不是 n 阶乘?【英文标题】:Why isn’t the complexity of selection sort n factorial?为什么选择排序的复杂度不是 n 阶乘? 【发布时间】:2022-01-06 14:11:11 【问题描述】:如果选择排序在数组上迭代 n 次,其中 n 是数组的长度,每次迭代的比较次数比上一次少 1 次(第一次迭代有 n 次比较),那么选择排序的复杂度是 n ^2 而不是 n!(n 阶乘)?
【问题讨论】:
我们第一次遍历数组时,需要进行 n-1 次比较。第二次,n-2 次比较。第三次,n-3 次比较。等等。最后比较的总数是 n-1 + n-2 + n-3 + ... + 3 + 2 + 1 = n * (n - 1) / 2 【参考方案1】:通常情况下,当您多次执行某个操作时,运行时间就会增加。因此,例如,如果我执行 10 次操作 5 次,那么我将执行总共 50 次操作。
另一方面,当你做一件事,然后做下一个,等等时,会增加运行时间。所以,例如,如果我做 10 个工作单元,然后是 5 个工作单元,我总共会做15 个工作单元。
您是正确的,选择排序首先查看 n 个项目,然后是 n-1 个项目,然后是 n-2 个项目,然后是 n-3 个项目,等等。问题是我们如何从那个到总运行时间。您建议将它们相乘:
n·(n-1)·(n-2)····2·1
但是,这意味着“我做 n 件事 n-1 次,然后做 n-2 次,然后再做 n-3 次,等等。”
这就是为什么我们将它们加在一起:
n + (n-1) + (n-2) + ... + 2 + 1 = n(n+1)/2 = Θ(n2)。
【讨论】:
以上是关于为啥选择排序的复杂度不是 n 阶乘?的主要内容,如果未能解决你的问题,请参考以下文章
为啥快速排序算法的时间复杂度是O(nlogn)而不是O(n²)?