遞迴演算法轉化為非遞迴實現的核心思想是"用棧來模式遞迴函式棧"。
實現主要考慮:入棧/出棧的邏輯
對於快速排序來說。。
棧元素包括,輸入序列的左右下標,初始時將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)
;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
實現中的一些問題:
c語言中struct不能直接賦值,也就是說struct stack s1=s2;語法錯誤
我錯了,結構體居然可以直接賦值,做了好多無聊的事情。。。
非遞迴版本的快速排序
快速排序 每次選擇乙個樞軸,比樞軸大的元素放在陣列的右半部分,比樞軸小的元素放在陣列的左半部分。然後遞迴的進入陣列的左右兩半部分。如果要用非遞迴來實現,我們需要用棧來儲存陣列左右兩半部分的邊界。如下 int partition vector nums,int start,int last while...
快速排序實現(遞迴 非遞迴)
首先是劃分演算法,假設每次都以第乙個元素作為樞軸值,進行一趟劃分 int partition int a,int low,int high a low pivot 將樞軸值元素置於最終位置 return low 第乙個while迴圈裡的 還可以採用如下形式 while low high a high...
快速排序遞迴與非遞迴
快速排序思想 以公升序為例 在要排序的序列中選乙個基準,使它左邊的數都比它小,右邊的數都比它大。具體步驟 1 區間選乙個key,可以選區間右邊界的那個數 2 讓begin從區間左邊界開始往後找大於key的數,找到後停下來,再讓end從區間右邊界 1開始往前找小於key的數,找到後讓它和begin找的...