【问题标题】:Sorting array using medians使用中位数对数组进行排序
【发布时间】:2015-02-15 23:50:16
【问题描述】:

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

谢谢

【问题讨论】:

标签: arrays algorithm sorting median


【解决方案1】:

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

  1. 给定一个长度为n的数组作为输入,我们首先应用X方法求输入数字的中位数m,这需要时间O(n)
  2. 然后我们扫描输入数组以重新排列数组中的数字,使所有小于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))

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2012-10-02
      • 2017-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-02
      • 2012-11-14
      相关资源
      最近更新 更多