【选择排序之堆排序】


堆排序:

代码如下:

# -*- coding = utf-8 -*-
# @Time : 2022/5/22 20:32
# @Author : lxw_pro
# @File : py-25.py
# @Software : PyCharm

# 选择排序————堆排序:
'''
堆逻辑结构是一颗完全二叉树,采用顺序存储结构
ki>=k2i,ki>=k2i+1   ~大顶堆
ki<=k2i,ki<=k2i+1   ~小顶堆

'''

# 怎样用堆来实现排序?
'''
1-通过堆可以找到最大值或最小值,取走;
2-把剩下的元素调整成一个新堆。

'''

# 堆排序基本思想:
'''
1-以初始关键字序列,建立堆;输出
2-输出堆顶最小(最大)元素
3-调整余下的元素,使其成为一个新堆;
4-重复2,3步,直到n个元素输出,得到一个有序序列。

堆调整方法:
1-将堆顶元素和堆的最后一个元素位置交换;
2-然后以当前堆顶元素和其左、右子树的根结点今夕ing比较,并与值较小的结点进行交换
3-重复第2步,继续调整被交换过的子树,直到叶结点或没进行交换为止。
称这个调整过程为“筛选”。

如何来建初始堆?
对一个无序序列反复“筛选”就可以得到一个堆。

'''


def HeadAdjust(li, parent, length):             # 筛选算法,以小顶堆为例
    tmp = li[parent]
    i = parent
    j = 2 * i                                   # j是左子树
    while j <= length:
        if j < length and li[j] > li[j+1]:      # 找出左右孩子中较小值
            j += 1
        if tmp > li[j]:                          # 找出根和左右孩子中最小值
            li[i] = li[j]                        # 最小值放在根上
            i = j                                # 延孩子朝叶子结点查找
            j = 2 * i                            # j是i的左子树
        else:
            break
    li[i] = tmp

上一章链接:选择排序(上)


外(平衡二叉排序树)~了解

# 平衡二叉排序树:
'''
含有n个结点的二叉排序树的平均查找长度和树的形态有关。
最好的情况:ASL=log2(n+1)
时间复杂度为:O(log2n)

最坏的情况:ASL=(n+1)/2
时间的复杂度:O(n)

'''


# 平衡二叉树(AVL树):
'''
平衡二叉树:
或者是一颗空树,或者是具有下列性质的二叉排序树;
它的左子树或右子树都是平衡二叉树,
且左子树和右子树的深度之差的绝对值不超过1.

结点的平衡因子~结点的左子树的深度减去它的右子树的深度
1-平衡二叉树上所有结点的平衡因子只可能是-1、0和1.
2-只要二叉树上有一个结点的平衡因子的绝对值大1,则该二叉树就是不平衡的。

'''

江湖一言:

其实人跟树是一样的,越是向往高处的阳光,它的根就越要伸向黑暗的地底。


持续更新中…

猜你喜欢

转载自blog.csdn.net/m0_66318554/article/details/124867467