递归算法转化为非递归实现的核心思想是"用栈来模式递归函数栈"。
实现主要考虑:入栈/出栈的逻辑
对于快速排序来说。。
栈元素包括,输入序列的左右下标,初始时将0,n-1
每次循环
取出栈顶元素(p,q),若q<=p即该段子序列只有0/1个元素,则此次循环结束
在该段元素序列中执行快速排序核心算法: 确定新的中间元素 i+1
将(p,i) 和 (i+1,q) 压栈
循环结束条件:栈为空
这个递归算法如此实现的基础是:任何二次递归之间没有重叠部分
相比较而言,动态规划的实现就需要一个表来存储所有的中间结果,以使重叠部分透明
实现核心代码:
int quickSort_nonRecur(float A[],int p,int q)
{
struct stack *ptr_s;
stack_declare(ptr_s);
elementType e = {p,q};
push(ptr_s,e);
while(!isStackEmpty(ptr_s))
{
pop(ptr_s,e);
if(e.left >= e.right)
continue;
float pivot = A[e.right];
int i = e.left-1;
int j;
for(j=e.left;j<e.right;j++)
if(A[j]<pivot) {SWAP(A[i+1],A[j]); i++;}
SWAP(A[i+1],A[e.right]);
push(ptr_s,element_create(e.left,i));
push(ptr_s,element_create(i+2,e.right));
}
}
实现中的一些问题:
C语言中struct不能直接赋值,也就是说struct stack s1=s2;语法错误
我错了,结构体居然可以直接赋值,做了好多无聊的事情。。。

本文介绍了一种非递归方式实现快速排序的方法,通过使用栈模拟递归过程,避免了递归带来的潜在堆栈溢出问题。具体实现上,利用栈来存储待排序区间的左右边界,并在每个循环中取出栈顶元素进行快速排序的核心操作。
923

被折叠的 条评论
为什么被折叠?



