遞歸行為的時間複雜度估算

整個遞歸過程是一棵多叉樹,遞歸過程相當于利用棧做了一次後序周遊。
對于master公式,T(N)表明母問題的規模為N,T(N/b)表明每次子問題的規模,a為調用次數,加号後面表明,除去調用之外,剩餘語句的複雜度是多少,算出d。根據上次三個判斷公式進行算法時間複雜度計算。
歸并排序(遞歸實作)
求出中點位置,先将左邊部分排好序,再将右側部分排好序,再整合(雙指針),使得整體有序。
時間複雜度O(NlogN) ;空間複雜度O(N)
小和問題
看某個數右側有多少數比該數大,那麼就有這麼多個該數對最後結果造成貢獻(使用歸并排序,在歸并過程中進行計算)。和傳統merge相比,在于左組數等于右組數時,在小和問題中一定要先拷貝右組的數。
逆序對問題
同小和問題,隻不過換成了判斷左數組的數大于右數組的數。
315. 計算右側小于目前元素的個數 - 力扣(LeetCode)
https://leetcode.cn/problems/count-of-smaller-numbers-after-self/
快速排序
問題一:準備一個變量,表示小于等于區域的右邊界,如果目前數小于等于num,則把目前數和區域下一個數做交換,區域往右擴一個位置,目前數跳下一個。若目前數大于num,那麼跳下一個數即可。
問題二:和問題一類似,兩個區域,一個為小于區域的右邊界i,一個為大于區域的左邊界j,兩個變量。目前數小于num,目前數和i數交換,i++,目前數跳下一個。目前數等于num,直接跳下一個。目前數大于num,目前數和j數交換,j--,目前數不動。
那麼快速排序,就是以數組内最後一個數作為num,重複上述問題二,最後将大于區域第一個數與最後一個數交換,遞歸進行即可。
時間複雜度O(N^2)
但如果選取num是随機的,選出來與最後一個數交換然後做劃分,可以避免出現最壞情況。
時間複雜度O(NlogN)