算法_堆排序_python

#堆排序
def adjust(lst,beg,end,isBeg = True):
    
    i = 0
    if end ==1:
        i = 0
    else:
    
        i =  int((end - 2)/2) + (end - 2)%2
    rang = None
    if isBeg:
        rang =range(i +1)
    else:
        rang =range(i,-1,-1)
    
    for j in rang:
        right = 2*j + 2
        left = 2*j +1
        if right <= end and lst[right] >lst[j]:
            if lst[right] > lst[left]:
                lst[j],lst[right] = lst[right],lst[j]
            else:
                lst[j],lst[left] = lst[left],lst[j]
            
        
        elif  lst[left] > lst[j]:
            lst[j],lst[left] = lst[left],lst[j]

#paixu
def duisort(lst):
    length = len(lst)
    if length <=1:
        return    
    #从下往上
    adjust(lst,0,length -1,False)
    #从上往下
    adjust(lst,0,length -1)
    

    for i in range(length -1,0,-1):
        lst[0],lst[i] = lst[i],lst[0]
        #从上往下
        adjust(lst,0,i-1)
        print(lst)


if __name__ == "__main__":
    lst  = [7,23,4,6,7,8,22,33,5,767,8,99,3,234]
    #lst  = [9,4,5,6,8,10,2,17,11,3,2]
    #lst = [16,7,3,20,17,8]
   
    duisort(lst)
    print(lst)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值