# -*- coding: utf-8 -*- class Solution: # @param A: Given an integer array # @return: void def heapify(self, A): # write your code here ''' 为什么从1/2的位置从后往前遍历? 因为对于堆中下标为i的元素,子节点下标为i * 2 + 1和i * 2 + 2, 对于下标大于1/2位置的元素一定是叶子节点,无须做向下调整。 ''' for i in xrange((len(A) - 1) / 2, -1, -1): while i < len(A): left, right = i * 2 + 1, i * 2 + 2 min_pos = i if (left < len(A)) and (A[left] < A[min_pos]): min_pos = left if (right < len(A)) and (A[right] < A[min_pos]): min_pos = right if min_pos != i: # 调整A[i]元素位置,继续向下调整。 A[i], A[min_pos] = A[min_pos], A[i] i = min_pos else: # min_pos没变,A[i]无须调整,结束循环。 break