假设您有这种快速排序实现,这可能与标准实现略有不同:
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)
只会返回空列表。
这是对的吗?
答案 0 :(得分:0)
是的,如果您描述时间复杂度为O(n)
。
但是,该空间也将是O(n)
,因为需要创建新列表equal
。更糟糕的是qsort就地排序所以具有O(1)
(常数)空间要求。
O(n lg(n))
的qsort时间复杂度是假设统计随机数据计算的平均情况。你的改编将有助于在边缘情况下的表现,所有的值都是相等的,这是非常不可能的(虽然你可能事先了解了数据,这使得它更有可能)。
如果您正在考虑使用此算法而不是标准qsort,我建议不要使用它。由于使用额外列表会增加元素和连接的开销(其中此开销取决于列表的实现)。 qsort中不存在此开销,因为它已就地排序。