快速排序中的堆栈深度
2012-11-07 10:02
113 查看
快速排序的伪代码如下:
核心思想仍然是采用迭代控制结构替代递归调用。前一次的思想是执行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
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
相关文章推荐
- 算法导论7-4思考题-快速排序中的堆栈深度-尾递归技术
- 快速排序中的堆栈深度
- 快速排序中的堆栈深度
- 快速排序中的堆栈深度
- PInvoke调用导致堆栈不对称 c#调用C++win32非托管dll的问题深度分析
- PInvoke调用导致堆栈不对称 c#调用C++win32非托管dll的问题深度分析
- 深度剖析 Linux0.11 系统中堆栈的使用方法
- PInvoke调用导致堆栈不对称 c#调用C++win32非托管dll的问题深度分析
- C基础:堆栈性质应用深度搜索
- PInvoke调用导致堆栈不对称 c#调用C++win32非托管dll的问题深度分析
- 链式二叉树的前序创建、递归前序遍历、非递归堆栈前序遍历、前序销毁以及求二叉树的深度
- 算法导论习题7-4—快排中堆栈深度的优化
- PInvoke调用导致堆栈不对称 c#调用C++win32非托管dll的问题深度分析
- PInvoke调用导致堆栈不对称 c#调用C++win32非托管dll的问题深度分析
- 深度堆栈自编码网络
- 堆栈的深度理解
- 堆栈的深度理解
- PIC 单片机 中的堆栈是硬件实现的,其深度已随芯片而固定,无法实现需要大量堆栈操作的递归算法
- 【编程珠玑】第十一章 排序 (插入排序和快速排序的深度优化)
- 【编程珠玑】第十一章 排序 (插入排序和快速排序的深度优化)