平均排序

来源:互联网 发布:js redirect 重定向 编辑:程序博客网 时间:2024/04/29 08:41

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元素的数组。

原创粉丝点击