非递归方式实现堆排序

算法复杂度:n*log(n),即每次调整堆的时间复杂度为lon(n),总的时间复杂度为log(n)+log(n-1)+..+log(1) =log(n!) =nlog(n)

每次都为对二叉树做搜索

思路:

①顺序存储方式初始化堆

②逐步调整堆

#交换
def swap(arr,i,j):
    temp = arr[i]
    arr[i] = arr[j]
    arr[j] = temp
#初始化最大堆,顺序存储
def heapInsert(arr,index):
    parent = 0
    
    while index != 0:
        parent = (index-1) // 2
        
        if arr[parent] < arr[index]:
            swap(arr,index,parent)
            index = parent
        else:
            break
#调整堆
def heapify(arr,index,size):
    left = index*2 + 1
    right = index*2 + 2
    largest = index
    
    while (left < size):
        
        if arr[largest] < arr[left]:
            largest = left
            
        if right < size and arr[largest] < arr[right]:
            largest = right
            
        if largest != index:
            swap(arr,index,largest)
        else:
            break
        index =  largest
        left = index*2+1
        right = index*2 + 2
#主函数,先初始化最大堆,再逐次调整堆
def heapSort(arr):
    for index in range(len(arr)):
        heapInsert(arr,index)  
        
    for index in range(len(arr)-1,-1,-1):
        swap(arr,0,index)
        heapify(arr,0,index)

if __name__ == '__main__':
    lis = [3,4,6,1,5,7,9,0,2]
    heapSort(lis)

 初始化堆的时间复杂度 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值