首页 > 编程语言 > 详细

算法--排序

时间:2020-04-08 15:14:42      阅读:60      评论:0      收藏:0      [点我收藏+]
def sift(li, low, high):
    ‘‘‘
    :param li:树
    :param low: 树的根节点
    :param high: 树的最后一个节点
    :return:向下调整树
    ‘‘‘
    tmp = li[low]  # 去除树根作为临时变量
    i = low  # i指向空位
    j = 2 * i + 1  # 第一次  j指向根节点的左孩子
    while j <= high:  # 循环继续的条件:j不越界;This the second end condition:j越界
        # 1.比较左右子节点
        if j + 1 <= high and li[j] < li[j + 1]:  # 右节点存在,才进行左右比较
            j += 1  # 将j指向j+1

        if li[j] > tmp:  # 调整位置
            li[i] = li[j]  # 空位的元素填成j下标的元素,所谓的调整
            i = j  # 向下调整
            j = 2 * j + 1  # 从当前j节点找左孩子
        else:
            break  # j位置的元素>tmp 停止循环,This the first end condition
    li[i] = tmp  # 结束循环,空位填充tmp

#堆排
def heak_sort(li):
    n = len(li)
    # 1.构造堆
    for low in range((n - 2) // 2, -1, -1):  # 根据子节点找父节点i-->(i-1)//2
        sift(li, low, n - 1)
    print(li)
    # 2.挨个出数
    for high in range(n - 1, -1, -1):
        li[0], li[high] = li[high], li[0]
        sift(li, 0, high - 1)  # 排除堆中的最后一个元素


li = [8, 1, 2, 6, 3, 7]
heak_sort(li)
print(li)  # [1, 2, 3, 6, 7, 8]

 

算法--排序

原文:https://www.cnblogs.com/liuer-mihou/p/12659785.html

(1)
(1)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!