【发布时间】:2015-02-15 23:50:16
【问题描述】:
所以让我们假设您有一个算法用于查找数组的中位数并调用此方法 X。X 基本上会在 O(n) 时间内找到数组 a(a 未排序)的中位数。我将如何设计一个 O(n log n) 时间算法来对数组 a 进行排序,使用 X 作为辅助方法。 真的无法理解中位数将帮助我对数组进行排序的事实...... ??
谢谢
【问题讨论】:
标签: arrays algorithm sorting median
所以让我们假设您有一个算法用于查找数组的中位数并调用此方法 X。X 基本上会在 O(n) 时间内找到数组 a(a 未排序)的中位数。我将如何设计一个 O(n log n) 时间算法来对数组 a 进行排序,使用 X 作为辅助方法。 真的无法理解中位数将帮助我对数组进行排序的事实...... ??
谢谢
【问题讨论】:
标签: arrays algorithm sorting median
您可以通过递归应用 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))
【讨论】:
在快速排序中,如果枢轴是随机选择的,则对数组进行排序的最坏情况复杂度为 O(n^2)。
但也有快速排序的变体,其最坏情况的时间复杂度为 O(nlgn)。在这些变体中,枢轴元素是数组的中位数(第 n/2 个元素),或者枢轴位置是数组大小的函数,因此它可以将数组分成两部分,它们是数组大小的函数(不是常数)。
【讨论】: