概述
一个典型的快速排序如下
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
转载于:https://www.cnblogs.com/emailck/p/3387128.html
最后
以上就是苗条眼神为你收集整理的快速排序的堆栈深度的全部内容,希望文章能够帮你解决快速排序的堆栈深度所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复