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項的過程中,不僅會存在重複計算的項,而且而且函式呼叫自身也是有時間和空間消耗的,涉及到往棧中壓入資料和彈出資料,這將消耗...