8-5 平均排序
假设我们不是要排序一个数组,而只是要求数组中的元素一般情况下都是层递增序的。更准确地说,称一个包含n个元素的数组A为k排序的(k-sorted),如果对所有i=1,2, ..., n-k,有下式成立:
a)给出一个数组是1排序的是什么意思?
b)给出数字1,2, ..., 10的一个排列,它是2排序的,但不是完全排序的。
c)证明:一个n元素的数组是k排序的,当且仅当对所有i=1,2, .... n-k 有 A[i] ≤ A[i+k]。
d)给出一个算法,它能在O(nlg(n/k))时间内,对一个n元素的数组进行k排序。
e)说明一个长度为n的k排序的数组可以在O(nlgk)内排序。
f)说明当k是一个常量时,需要Θ(nlgn)时间来k排序一个n元素的数组。(提示:可以利用前一部分的结果及比较排序的下界)
分析与解答:
a)数组1排序时就和我们平常的排序一样了。
b)2排序但不是全排序的例子:
1 6 2 7 3 8 4 9 5 10
c) 该推论非常容易得到,证明如下:
d)根据c)得到的结果,一个n元素的数组是k排序,当且仅当A[i] ≤ A[i+k]。也就是说,等价于
A[0] ≤ A[k] ≤ A[2k] ≤ A[3k] ....
A[1] ≤ A[k+1] ≤ A[2k+1] ≤ A[3k+1] ...
..........
根据上述观察,我们可以分成k个独立的分组,每个分组的大小为n/k进行排序即可。
每个大小为n/k的分组进行排序的时间复杂度为O(n/k*lg(n/k)),那么k个分组总的时间复杂度为
k*O(n/k*lg(n/k)) = O(nlg(n/k))
e) 使用k个元素的最小堆,进行k路归并,每次提取最小值和增加一个新元素的时间复杂为O(lgk),总共需要n次提取最小值和增加新元素的操 作, 则对应的时间复杂度为O(nlgk)。
f)因为可以采用O(nlg(n/k)时间内对一个n元素的数组进行k排序,则时间复杂度为O(nlg(n))
以下用决策树得到k排序的下界:
一个n元素的数组最后生成的可能k排序的数目为
那么,决策树的高度h满足
即时间复杂度为Ω(nlg(n))
结合上面的结果以及基于比较的k排序的下界可知,当k是一个常量时,需要Θ(nlgn)时间来k排序一个n元素的数组。