快速排序变化的最佳情况

时间:2013-07-11 07:22:57

标签: 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, 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(smaller)qsort(greater)只会返回空列表。

这是对的吗?

1 个答案:

答案 0 :(得分:0)

是的,如果您描述时间复杂度为O(n)

但是,该空间也将是O(n),因为需要创建新列表equal。更糟糕的是qsort就地排序所以具有O(1)(常数)空间要求。

O(n lg(n))的qsort时间复杂度是假设统计随机数据计算的平均情况。你的改编将有助于在边缘情况下的表现,所有的值都是相等的,这是非常不可能的(虽然你可能事先了解了数据,这使得它更有可能)。

如果您正在考虑使用此算法而不是标准qsort,我建议不要使用它。由于使用额外列表会增加元素和连接的开销(其中此开销取决于列表的实现)。 qsort中不存在此开销,因为它已就地排序。