每日程式設計7之快速排序非遞迴版本

2021-06-12 19:33:09 字數 736 閱讀 5551

遞迴演算法轉化為非遞迴實現的核心思想是"用棧來模式遞迴函式棧"。

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

對於快速排序來說。。

棧元素包括,輸入序列的左右下標,初始時將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找的...