堆排序 python方法类(思路也适用于C语言数组)并附有视频详解

def sift(li,low,head):
    """
    :param li:你创建的列表
    :param low:根节点位置
    :param head:最后一个节点的位置
    :return:
    """
    i=low#堆顶元素
    j=2*i+1# 堆顶的左孩子
    tmp=li[low]#保存堆顶后面用
    while j<=head:#判断堆是否排序完了
        if j+1<=head and li[j+1]>li[j]:#判断左右子树的大小将j指向较大的那个
            j=j+1
        if li[j]>tmp:#如果孩子大于根
            li[i]=li[j]#根等于这个孩子
            i=j#将i下移
            j=2*i+1#将j下移
        else:#如果孩子不大于根
            li[i]=tmp#就把这个根作为这个堆的根
            break
    else:#
        li[i]=tmp

def heap_sort(li):#构建堆
    n=len(li)#输入列表的长度
    for i in range((n-2)//2,-1,-1):#找的最后一个元素父节点的位置并转换这么多次
        sift(li,i,n-1)
    for i in range(n-1,-1,-1):#输出堆顶元素
        li[0],li[i]=li[i],li[0]
        sift(li,0,i-1)#i—1是判断越界的条件这里将因为建堆和排序都是在一个序列进行的所以要改变越界条件
    return li

li=[int(i) for i in input().split()]
heap_sort(li)
print(li)

视频详解链接:链接地址

猜你喜欢

转载自blog.csdn.net/jiahuiandxuehui/article/details/113060180