python实现的堆排序算法代码

2022-03-11 00:00:00 代码 算法 排序

python实现的堆排序算法代码,以下使用两种不同的方式实现了堆排序算法

"""
作者:皮蛋编程(https://www.pidancode.com)
创建日期:2022/3/21
功能描述:python实现的堆排序算法代码
"""

# 方法1
def heapSort(a):
    def sift(start, count):
        root = start
        while root * 2 + 1 < count:
            child = root * 2 + 1
            if child < count - 1 and a[child] < a[child + 1]:
                child += 1
            if a[root] < a[child]:
                a[root], a[child] = a[child], a[root]
                root = child
            else:
                return

    count = len(a)
    start = int(count / 2) - 1
    end = count - 1
    while start >= 0:
        sift(start, count)
        start -= 1
    while end > 0:
        a[end], a[0] = a[0], a[end]
        sift(0, end)
        end -= 1


a = [-8, 0, 1, 3, 11, 35, 68]
heapSort(a)
print(a)

输出结果:[-8, 0, 1, 3, 11, 35, 68]

# 方法2
def heapsort(a):
    def swap(a, i, j):
        tmp = a[i]
        a[i] = a[j]
        a[j] = tmp

    def siftdown(a, i, size):
        l = 2 * i + 1
        r = 2 * i + 2
        largest = i
        if l <= size - 1 and a[l] > a[i]:
            largest = l
        if r <= size - 1 and a[r] > a[largest]:
            largest = r
        if largest != i:
            swap(a, i, largest)
            siftdown(a, largest, size)

    def heapify(a, size):
        p = (size / 2) - 1
        while p >= 0:
            siftdown(a, p, size)
            p -= 1

    size = len(a)
    heapify(a, size)
    end = size - 1
    while (end > 0):
        swap(a, 0, end)
        siftdown(a, 0, end)
        end -= 1

a = [-8, 0, 1, 3, 11, 35, 68]
heapSort(a)

输出结果:
[-8, 0, 1, 3, 11, 35, 68]

以上代码在Python3.9环境测试通过

相关文章