堆排序的python实现及时间复杂度分析

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/c838556614/article/details/85331023

堆是一种形如二叉树的抽象数据结构,要求根节点的元素大于(小于)左右子树的节点,左右子树也需满足上述条件,是一种递归定义。

堆排序的python实现,主要分为两大部分:

1.根据原始数组建立初始堆,只需要从最后一个父节点(数组的中间元素)开始向前逐一进行修改,修改是将其与后面的元素进行比较,交换。位于数组中间元素之后的元素看作树的叶子结点无需进行校正。这部分时间复杂度O(n) ;

2.每次交换列表的首尾元素,使得堆顶的最大(或最小)元素依次移到数组尾端,原来位于尾端的元素放到堆顶进行重新调整,每次迭代待排序数组长度-1,这样大顶堆最后会变成递增序列,小顶堆最后会变成递减序列。这部分时间复杂度O(nlogn)

时间复杂度分析见后面。应用:可用于求解最小的k个数等问题。

def heap_build(ls, start, length): #建立最大堆
    cur = ls[start]
    i = start
    j = 2 * i + 1
    while j < length:
        if j < length-1 and ls[j+1] > ls[j]: #选出左子节点和右子节点中较大的
            j += 1
        if cur < ls[j]:
            ls[i] = ls[j]
            i = j
            j = 2*i+1
        else: #否则不用再继续向下部伸展
            break
    ls[i] = cur

def swap(ls, i, j):
    ls[i], ls[j] = ls[j], ls[i]
    return ls
    
def heap_sort(ls):
    length = len(ls)
    for i in range(length//2, -1, -1): #初始化建堆
        heap_build(ls,i,length)
    #-----开始排序,每次拿掉头节点后,重新排序--------
    for i in range(0,length-1):
        ls = swap(ls, 0, length-1-i) #每次拿走列表最前面的元素(当前最大值)放在列表尾端,最后形成一个递增序列。
        heap_build(ls, 0, length-1-i)
    return ls  

时间复杂度分析:

猜你喜欢

转载自blog.csdn.net/c838556614/article/details/85331023
今日推荐