Arrays 使用中位数排序数组
因此,我们假设您有一个方法的算法,可以找到一个数组的中位数,并调用这个方法X。X基本上可以在O(n)时间内找到一个数组的中位数a(a未排序)。我如何能够设计一个O(nlogn)时间算法来对数组a进行排序,使用X作为辅助方法。 我真的无法理解中值将帮助我对数组进行排序这一事实Arrays 使用中位数排序数组,arrays,algorithm,sorting,median,Arrays,Algorithm,Sorting,Median,因此,我们假设您有一个方法的算法,可以找到一个数组的中位数,并调用这个方法X。X基本上可以在O(n)时间内找到一个数组的中位数a(a未排序)。我如何能够设计一个O(nlogn)时间算法来对数组a进行排序,使用X作为辅助方法。 我真的无法理解中值将帮助我对数组进行排序这一事实 感谢快速排序中的,如果轴是随机选择的,则对数组进行排序的最坏情况复杂性为O(n^2) 但也有快速排序的变体,其最坏情况下的时间复杂度为O(nlgn)。在这些变体中,枢轴元素是数组的中位数(n/2个元素),或者枢轴位置是数组大
感谢快速排序中的,如果轴是随机选择的,则对数组进行排序的最坏情况复杂性为O(n^2)
但也有快速排序的变体,其最坏情况下的时间复杂度为O(nlgn)。在这些变体中,枢轴元素是数组的中位数(n/2个元素),或者枢轴位置是数组大小的函数,因此它可以将数组分成两部分,这两部分是数组大小的函数(不是常数)。可以通过递归应用X来解决此问题。考虑下面的子例程Y:
n
的数组作为输入,我们首先应用方法X来找到输入数字的中位数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))
给你,大个子: