O(n)求數組中第k大的元素——堆排序

建堆:O(n) 循環

詢問:O(logn)im

建堆複雜度的證實:img

首先這個循環是從i = headsize/2 -> 1,也就是說這是一個bottom-up的建堆。因而,有1/2的元素向下比較了一次,有1/4的向下比較了兩次,1/8的,向下比較了3次,......,1/2^k的向下比較了k次,其中1/2^k <= 1, k 約等於lg(n)。因而就有總的比較量:di

T = (\sum_{k = 1}^{lg(n)}{{1 \over {2^k}} \times k} ) * ntime

令 S = \sum_{k = 1}^{lg(n)}{{1 \over {2^k}} \times k}

1/2 S = \sum_{k = 1}^{lg(n) - 1}{{1 \over {2^{k+1}}} \times k} = {1 \over 4} + {1 \over 8} \times 2 + \cdots + {1 \over {2^{k+1}}} \times k
S - 1/2S = 1/2S = {1 \over 2} + {1 \over 4} + \cdots + {1 \over {2^k}} - {1 \over {2^{k+1}}} \times k到這步就很明顯了吧,S <= 2因而T <= 2n => T = O(n).

相關文章
相關標籤/搜索