快速排序中的堆栈深度


快速排序的伪代码如下:
QUICKSORT(A, p, r)
    if p < r
        q <- PARTITION(A, p, r)
        QUICISORT(A, p, q-1)
        QUICKSORT(A, q + 1, r)
可采用尾递归的方式减小堆栈的深度,即采用迭代控制结构替代第二次递归调用,尾递归在大多数的编译程序中都被采用。伪代码如下:
QUICKSORT(A, p, r)
    while p < r
        q <- PARTITION(A, p, r)
        QUICISORT(A, p, q-1)
        p <- q + 1
尽管此时平均堆栈深度已减小,但最坏情况下堆栈深度仍为θ(n),如数组元素已有序的情况下进行快速排序。那如何减小最坏情况下的堆栈深度?
核心思想仍然是采用迭代控制结构替代递归调用。前一次的思想是执行PARTITION后,对数组的前一部分( A[p...q-1] )进行递归排序,对后一部分( A[q+1...r] )进行迭代控制运算。
假设每次执行PARTITION后,(q-1) - p + 1 : r-(q+1) +1 = a ( a > 0 ),则有

n * a ^ h = 1
=> h = - lgn / lga
  • a < 1/2 => h < lgn
  • a = 1/2 => h = lgn
  • a > 1/2 => h > lgn
因此,执行完PARTITION后,对元素个数少的那一部分进行递归排序,而对另一部分进行迭代运算,可使堆栈深度小于lgn。

伪代码如下:

QUICKSORT(A, p, r)
    while p < r
        q <- PARTITION(A, p, r)
        if (q - 1) - p + 1 < r - (q + 1) + 1
            QUICISORT(A, p, q-1)
            p = q + 1
        else  
            QUICKSORT(A, q + 1, r)
            r = q - 1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值