【问题标题】:algorithm complexity of quicksort?快速排序的算法复杂度?
【发布时间】:2014-10-21 13:54:06
【问题描述】:

我找到了以下快速排序算法:

function quicksort(array)
    less, equal, greater := three empty arrays
    if length(array) > 1  
        pivot := select any element of array
        for each x in array
            if x < pivot then add x to less
            if x = pivot then add x to equal
            if x > pivot then add x to greater
        quicksort(less)
        quicksort(greater)
        array := concatenate(less, equal, greater)

我想通过找到递归关系来进行算法分析。对于我每次调用该算法时所看到的情况,例如,通过选择枢轴,在原始数组的第一个位置。它使用两个生成的列表再次调用快速排序,所以我将拥有:

                   one list ------ pow(2,0)=1
                less       greater--------2 lists----pow(2,1)=2
   less greater              less greater-------4 lists---pow(2,2)=4

所以它似乎形成了一种二叉树,所以如果我得到模式,它将是: 2^k=n,其中 k 是递归的级别,所以我将有 O(log n)

但是如何对复发进行分析呢?我的意思是,因为我没有计算函数的出栈过程,这是所有递归算法中都会发生的事情。

有什么帮助吗?谢谢

【问题讨论】:

    标签: algorithm recurrence


    【解决方案1】:

    首先,您应该考虑快速排序不是确定性的。所以你应该对最坏情况 - 最好情况 - 平均情况进行分析。

    以最坏的情况为例:

    T(n) = T(n-1) + O(n)

    O(n) 来自于您对整个数组进行分区这一事实。 相反,T(n-1) 是在最坏情况下要分区的元素数。

    如果你使用主定理解决递归,你会得到 O(n^2)

    同样在最好的情况下:

    T(n) = 2T(n/2) + O(n)

    这与合并排序相同,再次应用主定理得到 O(nlogn)。

    【讨论】:

    • 能否请您详细说明如何获得 O(n^2) 复杂度的主定理?
    【解决方案2】:

    我想你要找的是master theorem

    下面是使用该定理对快速排序的分析: https://stackoverflow.com/a/40308659/2534472

    【讨论】:

    • @Prasanna 完成。我现在链接了另一个 SO 答案,将来不太可能被删除。谢谢:)
    猜你喜欢
    • 2013-04-26
    • 1970-01-01
    • 2012-07-06
    • 1970-01-01
    • 2020-05-09
    • 2019-12-10
    • 2017-11-20
    • 1970-01-01
    • 2015-04-20
    相关资源
    最近更新 更多