使用中位数对数组进行排序

时间:2015-02-15 23:50:17

标签: arrays algorithm sorting median

所以假设你有一个算法来找到一个数组的中位数并让我们调用这个方法X.X基本上会在O(n)时间内找到数组a(a未排序)的中位数。我如何能够设计一个O(n log n)时间算法来排序数组a,使用X作为辅助方法。 无法理解中位数将帮助我对数组进行排序的事实...... ??

由于

2 个答案:

答案 0 :(得分:1)

在快速排序中,如果随机选择数据透视表,则对数组进行排序的最坏情况复杂度为O(n ^ 2)。

但是有快速排序的变体,其最坏情况时间复杂度为O(nlgn)。在这些变体中,pivot元素是数组的中位数(n / 2元素)或者pivot位置是数组大小的函数,因此它可以将数组分成两个部分,这两个部分是数组大小的函数(不是常数)。

答案 1 :(得分:1)

您可以通过递归应用X来解决此问题。考虑以下子程序Y:

  1. 给定一个长度为n的数组作为输入,我们首先应用方法X来查找输入数字的中位数m,这需要时间O(n)
  2. 然后我们扫描输入数组以重新排列数组中的数字,使得小于m的所有数字都在数组的左侧,而所有大于m的数字都是在数组的右侧(并且m位于数组的中间),请注意此步骤也需要时间O(n)
  3. 因此,对于长度为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))