每日編程7之快速排序非遞歸版本

遞歸算法轉化爲非遞歸實現的核心思想是"用棧來模式遞歸函數棧"。

實現主要考慮:入棧/出棧的邏輯

對於快速排序來說。。

棧元素包括,輸入序列的左右下標,初始時將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;語法錯誤

我錯了,結構體居然可以直接賦值,做了好多無聊的事情。。。







發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章