堆排序算法

堆排序算法可以实现O(lgn)时间复杂度的排序,是很优秀的排序算法。

一、最大堆实现降序排列

def heapfy(nums, i, size):
    left, right = 2 * i + 1, 2 * i + 2
    largest = left if left < size and  nums[left] > nums[i] else i
    largest = right if right < size and nums[right] > nums[largest] else largest
    if largest != i:
        nums[largest], nums[i] = nums[i], nums[largest]
        heapfy(nums, largest, size)

def heapSort(nums):
    size = len(nums)
    for i in range(size//2)[::-1]:
        heapfy(nums, i, size)
    for i in range(size)[::-1]:
        nums[0], nums[i] = nums[i], nums[0]
        size -= 1
        heapfy(nums, 0, size)
    return nums

二、最小堆实现升序排列

def heapfy(nums, i, size):
    left, right = 2 * i + 1, 2 * i + 2
    largest = left if left < size and  nums[left] < nums[i] else i
    largest = right if right < size and nums[right] < nums[largest] else largest
    if largest != i:
        nums[largest], nums[i] = nums[i], nums[largest]
        heapfy(nums, largest, size)

def heapSort(nums):
    size = len(nums)
    for i in range(size//2)[::-1]:
        heapfy(nums, i, size)
    for i in range(size)[::-1]:
        nums[0], nums[i] = nums[i], nums[0]
        size -= 1
        heapfy(nums, 0, size)
    return nums