python堆序算法

1.堆序排序的核心是要先建立堆 然后进行调整
堆的特点 任意子节点都比父节点小
2.调整 把最后一个元素和堆顶进行对比 如果大就保留

代码

'''
1.线建立一个堆

'''

def sift(data,low,hight):  #low循环的节点  hight 总长度
    i = low 
    j = 2*i +1
    tmp = data[i]  #把当前节点值记录下来
    while j < hight:   #子节点在总长度里面
        if j+1<=hight  and data[j] < data[j+1]:  #如果这个节点有右节点 而且右节点值比左节点大
            j +=1   #下标换成右侧节点值的下标  这个时候data[j]就是右侧大的数了
        if data[j] > tmp :   #如果走了上一步 那就是右侧的值 如果没走那就是左侧孩子的值
            data[i] = data[j]    #把大的值暂时放到 i这个节点上
            i = j
            j = 2 *i + 1   #再次循环这个节点的字节点

        else:
            break
        data[i]  = tmp  #把循环的最后一个节点放到data[i]上去
            
        
    


def heap_sort(data):
    n = len(data)
    for i in range(n//2 -1, -1, -1,-1);  #组成二叉树  拆一半 每个节点进行循环
        sift(data,i,n-1)                  # 进行堆的构建  这一步构建以后 满足堆的定义  任意子节点比父节点小
    for i in range(n-1,-1,-1):      #建堆完事以后 进行调整 最大的数放在最后
        data[0], data[i] = data[i], data[0]
        sift(data,0,i-1)


L = [1,7,2,45,87,23,46,76,99,38]
heap_sort(L)

print(L)  #建堆后  得到的数列为 [99, 87, 46, 76, 38, 23, 2, 7, 45, 1]
####最后排序结果为  [1, 2, 7, 23, 38, 45, 46, 76, 87, 99]


posted @ 2017-10-26 13:54  点||点  阅读(140)  评论(0编辑  收藏  举报