【題目描述】
Given an integer array, heapify it into a min-heap array.
For a heap array A, A[0] is the root of heap, and for each A[i], A[i 2 + 1] is the left child of A[i] and A[i 2 + 2] is the right child of A[i].
給出一個整數數組,堆化操作就是把它變成一個最小堆數組。
對於堆數組A,A[0]是堆的根,並對於每個A[i],A [i 2 + 1]是A[i]的左兒子並且A[i 2 + 2]是A[i]的右兒子。
【題目鏈接】
[www.lintcode.com/en/problem/heapify/]()
【題目解析】
Heapify一個Array,也就是對array中的元素進行siftup或者siftdown的操作。根據min heap定義進行操作即可。
這裏值得注意的是,對於掃描整個array的情況下,siftup和siftdown有complexity上的區別。
基本的原因在於:siftdown的complexity,實質上是node相對於bottom移動的次數,而根據binary heap本身的特性,決定了約靠近bottom的node越多;相對照的是siftup,是node相對於root節點的移動次數。
如果Heapify可以用O(n)實現,那麼HeapSort所需的時間複雜度爲何是O(nlogn)?因爲HeapSort其實包含了兩個步驟,第一步,Heapify,build (min) heap,所需時間複雜度O(n),第二步,依次刪除最小值(min heap),對於Heap來說,刪除操作的複雜度是O(logn), 而這個刪除需要執行O(n),來得到最終sort的結果,於是總體時間複雜度是O(nlogn)。
【參考答案】
[www.jiuzhang.com/solutions/heapify/]()