您的位置:首页 > 编程语言

每日编程7之快速排序非递归版本

2013-02-28 17:51 232 查看
递归算法转化为非递归实现的核心思想是"用栈来模式递归函数栈"。

实现主要考虑:入栈/出栈的逻辑

对于快速排序来说。。

栈元素包括,输入序列的左右下标,初始时将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;语法错误

我错了,结构体居然可以直接赋值,做了好多无聊的事情。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: