如果大小为n的数组只包含一个唯一数字(具有所有重复项的数组),则传统的快速排序算法将创建大小为1n-1的非常不均匀的分区.无论我们如何 Select 枢轴元素,情况都是如此.这将使此类输入的平均用例时间复杂性为O(n^2).

我想了一个简单的方法来缓解这个问题.在对数组进行分区时,如果元素恰好等于枢轴元素,我们可以(通过掷硬币的方式随机) Select 将其视为"小于"或"大于"枢轴,以便在枢轴周围均匀分布副本.

def partition(arr: list[int]):
  pivot = arr[-1]
  current_index = 0
  for i in range(len(arr) - 1):
    if arr[i] < pivot or (arr[i] == pivot and random.random() < 0.5):
      arr[i], arr[current_index] = arr[current_index], arr[i]
      current_index += 1
  # put the pivot in its place
  arr[-1], arr[current_index] = arr[current_index], arr[-1]
  # return the partition index
  return current_index

(强调arr[i] == pivot and random.random() < 0.5支票)

但我从未见过这种方法在任何地方被使用.这种方法有没有被广泛使用的问题?

推荐答案

如果大小为n的数组只包含一个唯一的数字(一个所有重复的数组),那么传统的快速排序算法将创建大小为1和n-1的非常不均匀的分区.

只有在使用Lomuto分区方案时才会出现这种情况.如果使用Hoare分区方案(最初的快速排序方案),则拆分会随着副本数量的增加而变得理想,尽管它不必要地交换相等的元素.看看维基文章中的重复元素部分:

https://en.wikipedia.org/wiki/Quicksort

Python相关问答推荐

try 使用tensorFlow.keras.models时optree Import错误

Python中的锁定类和线程以实现dict移动

根据多列和一些条件创建新列

从 struct 类型创建MultiPolygon对象,并使用Polars列出[list[f64]列

不允许AMBIMA API请求方法

Pandas :多索引组

Pydantic 2.7.0模型接受字符串日期时间或无

pandas DataFrame GroupBy.diff函数的意外输出

Python daskValue错误:无法识别的区块管理器dask -必须是以下之一:[]

为什么tkinter框架没有被隐藏?

删除最后一个pip安装的包

运行总计基于多列pandas的分组和总和

按列分区,按另一列排序

' osmnx.shortest_track '返回有效源 node 和目标 node 的'无'

更改键盘按钮进入'

使用Python更新字典中的值

改进大型数据集的框架性能

如何在Python中使用另一个数据框更改列值(列表)

从列表中获取n个元素,其中list [i][0]== value''

Flask运行时无法在Python中打印到控制台