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

来源:互联网 发布:mac可以用搜狗输入法 编辑:程序博客网 时间:2024/05/16 07:25

递归算法转化为非递归实现的核心思想是"用栈来模式递归函数栈"。

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

对于快速排序来说。。

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

我错了,结构体居然可以直接赋值,做了好多无聊的事情。。。