快速排序的堆栈深度

一个典型的快速排序如下

QUICKSORT(A, p, r)

if (p < r)

  then q <- PARTITION(A, p, r)

      QUICKSORT(A, p, q-1)

      QUICKSORT(A, q+1, r)

 

显然在最底层一个函数返回之前,栈的深度为length(A).其实其中一个递归可以去掉。

QUICKSORT2(A, p, r)

while (p < r)

  then q <- random(p, r)

              QUICKSORT2(A, p, q-1)

     p = q+1

 

在最后一个函数返回之前,栈的深度为lg(length(A)).

简单分析:

我们把每一次函数调用看作一颗树的树叶。那么整个过程就是一颗2叉树。

第一情况,是左右节点同时入栈,不断地递归直到最深一层。这时候整棵树都入栈了。

第二种情况,假设某一时刻程序即将执行到p = q + 1这一步之前。注意该函数是优先递归的,能执行到这一步,肯定从某些函数返回了,这时候的栈已经不是最深的了。以q为根的左子树已经处理完毕。注意数组以q为分界分为两部分。左边的元素比q下标的元素小,右边的元素比q下标的元素大。现在执行p = q+1,注意q+1是右边子数组的起始坐标。然后进行下一个循环。其实这相当于对q的右子树进行递归。由于我们的总是先处理左节点,所以对q的右子树的递归直到遇到最左的节点,函数才能返回。这时候从树的跟到某个最深的节点的路径上的所有节点都在栈里面。所以栈的最大深度就是树的高。(下图红色为当前处理路径,蓝色为已经处理)

          1

    1        1

 1    1   1  1

1 1 1 1 1 1 

posted @ 2013-10-25 00:06  Homura  阅读(1537)  评论(0编辑  收藏  举报