所以假设你有一个算法来找到一个数组的中位数并让我们调用这个方法X.X基本上会在O(n)时间内找到数组a(a未排序)的中位数。我如何能够设计一个O(n log n)时间算法来排序数组a,使用X作为辅助方法。 无法理解中位数将帮助我对数组进行排序的事实...... ??
由于
答案 0 :(得分:1)
在快速排序中,如果随机选择数据透视表,则对数组进行排序的最坏情况复杂度为O(n ^ 2)。
但是有快速排序的变体,其最坏情况时间复杂度为O(nlgn)。在这些变体中,pivot元素是数组的中位数(n / 2元素)或者pivot位置是数组大小的函数,因此它可以将数组分成两个部分,这两个部分是数组大小的函数(不是常数)。
答案 1 :(得分:1)
您可以通过递归应用X来解决此问题。考虑以下子程序Y:
n
的数组作为输入,我们首先应用方法X来查找输入数字的中位数m
,这需要时间O(n)
。m
的所有数字都在数组的左侧,而所有大于m
的数字都是在数组的右侧(并且m
位于数组的中间),请注意此步骤也需要时间O(n)
。因此,对于长度为n
的输入数组,子程序Y总共花费O(n)
次。
因此,如果递归地将子例程Y应用于中间m
左侧和右侧的子数组并继续该过程,则输出将是一个排序数组,总时间由下式给出: :
T(n) = O(n) + 2 * O(n/2) + 4 * O(n/4) + ... + 2^log(n) * O(n / 2^log(n))
= O(n) + O(n) + O(n) + ... + O(n) // log(n) terms in total
= O(n log(n))