Big o 快速排序变化的最佳情况

Big o 快速排序变化的最佳情况,big-o,time-complexity,quicksort,Big O,Time Complexity,Quicksort,假设您有这种快速排序实现,它可能与标准实现略有不同: qsort(list): if list is of length 1 or lower - return list else - choose a random pivot smaller - get all elements that are smaller than the pivot equal - get all elements that are equal to the pivot,

假设您有这种快速排序实现,它可能与标准实现略有不同:

qsort(list):
if list is of length 1 or lower - 
     return list
else - 
     choose a random pivot 
     smaller - get all elements that are smaller than the pivot
     equal - get all elements that are equal to the pivot, including the pivot itself
     greater - get all elements that are greater than the pivot
     return qsort(smaller) + equal + qsort(greater)
该函数的最佳情况不是当函数收到一个所有元素都相同的列表时,并且在这种情况下,最佳情况时间复杂度将是
O(n)
,这比标准版本的快速排序的最佳情况时间复杂度更好,即
O(n log n)

原因是函数只创建一次这些分区,因为越来越小的列表将为空(因为所有元素都相同),这将结束递归,因为
qsort(较小)
qsort(较大)
将只返回空列表


正确吗?

是的,在您描述的情况下,时间复杂度将是
O(n)

但是,由于需要创建一个新的列表
equal
,因此空间也将是
O(n)
。这比qsort更糟糕,qsort在适当的位置进行排序,因此具有
O(1)
(常量)空间要求

O(n lg(n))
的qsort时间复杂度是假设统计随机数据计算的平均情况。您的调整将有助于在所有值都相等的边缘情况下提高性能,这是非常不可能的(尽管您可能事先知道数据,这使其更有可能)


如果你考虑使用这个算法而不是标准的qsort,我建议你不要使用它。因为额外列表的使用增加了元素添加和连接的开销(这种开销取决于列表的实现)。这种开销在qsort中并不存在,因为它是按顺序排列的。

我有一种感觉,qsort的这种变体可能比标准变体的空间更差,这就是为什么我可能不打算使用它,我只是想确保这种变体的最佳案例时间复杂度确实是O(n)。非常感谢你!