快排的非遞迴實現(騰訊面試題)

2021-10-04 19:16:13 字數 1336 閱讀 2099

leader面問了乙個快排的非遞迴實現,一下子蒙了。

因為平常從來都是遞迴的快排,當時只想到遞迴變非遞迴肯定要用到棧,但怎麼也想不出來,今天來補一下。

先把遞迴的寫一下吧

int

partition

(vector<

int>

& nums,

int left,

int right)

while

(left < right && nums[left]

< flag) left++;if

(left < right)

} nums[left]

= flag;

return left;

}void

qsort

(vector<

int>

& nums,

int left,

int right)

int pos =

partition

(nums, left, right)

;qsort

(nums, left, pos -1)

;qsort

(nums, pos +

1, right)

;}

下面是非遞迴,非遞迴的思路就是用棧來記錄哪一段沒有排序,然後不斷的出棧對這一段進行排序,思路確實不難。。當時緊張的環境下確實是蒙了。

int

partition

(vector<

int>

& nums,

int left,

int right)

while

(left < right && nums[left]

< flag) left++;if

(left < right)

} nums[left]

= flag;

return left;

}void

qsort

(vector<

int>

& nums,

int left,

int right)

stack<

int> st;

int pos =

partition

(nums, left, right);if

(left < pos -1)

if(right > pos +1)

while

(!st.

empty()

)if(end > i +1)

}return

;}

快排非遞迴實現

int partition int arr,int low,int high arr low pivot return low void non recursive qsort int arr,int low,int high if high pivot 1 其實就是用棧儲存每乙個待排序子串的首尾元...

各種面試題 鍊錶快排

前面寫了個鍊錶的歸併排序,這裡再寫個鍊錶的快排。鍊錶的快排處理其實跟陣列的沒什麼區別,只是在partition要三位取中的話稍微煩一點 include include includeusing namespace std struct listnode typedef listnode ln ln ...

面試題9 遞迴和非遞迴

1.題目 編寫函式,計算斐波拉契數列的第n項。定義如圖 分析 這是乙個經典的問題,很多人都會用遞迴的方法去解決,但是實際的效果真的可以用嗎,如果採用遞迴的方法,在求斐波拉契數列第n項的過程中,不僅會存在重複計算的項,而且而且函式呼叫自身也是有時間和空間消耗的,涉及到往棧中壓入資料和彈出資料,這將消耗...