arrays - 特定类型数组的快速排序算法时间复杂度
问题描述
我正在学习算法课程,希望对以下问题有所帮助:
[k+1, ..., n, 1, ..., k]
数组where的快速排序算法的时间复杂度是多少k > n/2
,并且枢轴总是被选为子数组的最右边的单元格?会是
O(n²)
还是O(n log n)
?
从过去一个学期的扫描算法测试中,学生说O(n²)
(经过几次模拟后我同意了),但是那个学生没有解释就得到了错误的答案。当我们三个人自己得出相同的结论时,我和其他几个学生对为什么答案被标记为错误感到困惑。
解决方案
O(n²) 是正确的。
第一次运行将选择最右边的元素k
作为枢轴,将数组的其余部分划分为[1, ..., k-1]
左侧和[k+1, ..., n]
右侧。由于这两个子数组都是按排序顺序排列的,因此它们的形式是快速排序选择最右边的元素作为枢轴需要二次时间。
因此,对分区的左侧进行排序将花费 O(k²) 时间,而对右侧进行排序将花费 O((nk)²) 时间。因为我们有n/2 < k <= n
,所以我们也有 O(k²) = O(n²)。
推荐阅读
- python - 使用 geopandas 和 folium 在 python 中绘制多边形
- jenkins - Jenkins 中的“容器”关键字是什么?
- apache-spark - 如何使用pyspark制作大小为n * k的空矩阵?
- google-chrome - Mac Voiceover 键盘快捷键适用于 safari 但不适用于 chrome
- php - 实现搜索查询 MySql 的正确方法
- reactive-programming - 如何在 Vert.x 中取消对 Reactive Stream 的订阅
- python - 在画布内实现滚动条属性错误
- r - 将循环转换为应用,虹膜示例
- solr - Apache Solr 的 Spring 数据中的日期类型
- python - PyParsing大(百万行+)文件