遞歸算法轉化爲非遞歸實現的核心思想是"用棧來模式遞歸函數棧"。
實現主要考慮:入棧/出棧的邏輯
對於快速排序來說。。
棧元素包括,輸入序列的左右下標,初始時將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;語法錯誤
我錯了,結構體居然可以直接賦值,做了好多無聊的事情。。。