python排序--堆排序

树的概念

树是一种数据结构 比如:目录结构
树是一种可以递归定义的数据结构
树是由n个节点组成的集合:

  • 如果n=0,那这是一棵空树
  • 如果n>0,那存在1个节点作为树的根节点,其他节点可以分为m个集合,每个集合本身又是一颗树
  • 一些概念
  • 根节点
  • 树的深度(高度)
  • 树的度
  • 孩子节点/父节点
  • 子树
    在这里插入图片描述

二叉树–度不超过2的树

二叉树 度不超过2的树

每个节点最多有两个孩子节点

两个孩子节点被区分为左孩子节点和右孩子节点
在这里插入图片描述满二叉树

  • 一个二叉树,如果每一层的结点数都达到最大值,则这个二叉树就是满二叉树

完全二叉树

  • 叶节点只能出现在最下层和次下层,并且最下面一层的结点都集中在该层最左边的若干位置的二叉树
    在这里插入图片描述二叉树的存储方式(表示方式)
    链式存储方式
    顺序存储方式(用列表存取)
    堆是一个特殊的完全二叉树
    因为是堆排序,所以先了解一下顺序存储方式
    在这里插入图片描述### 堆排序–什么是堆
    堆:一种特殊的完全二叉树
  • 大根堆:一棵完全二叉树,满足任一节点都比其他孩子节点大
  • 小根堆:一棵完全二叉树,满足任一节点都比其他孩子节点小
    在这里插入图片描述

堆的向下调整

假设:节点的左右子树都是堆,但自身不是堆
当根节点的左右子树都是堆时,可以通过一次向下的调整来将其变换成一个堆
在这里插入图片描述
在这里插入图片描述

堆排序过程

  1. 建立堆
  2. 得到堆顶元素,为最大元素
  3. 去掉堆顶,将堆最后一个元素放到堆顶,此时可通过一次调整重新使堆有序
  4. 堆顶元素为第二大元素
  5. 重复步骤3,直到堆变空

构造堆

从最后面的小节点调整,慢慢构造成整个堆

堆实现代码

def sift(li, low, high):
    """
    
    :param li: 列表
    :param low: 堆的根节点位置
    :param high: 堆的最后一个元素的位置
    :return: 
    """
    i = low # i最开始指向根节点
    j = 2 * i + 1 # j开始是左孩子
    tmp = li[low] # 把堆顶存起来
    while j <= high: # 只要j位置有数
        if j+1<= high and li[j+1] > li[j]: # 如果右孩子有并且比较大
            j = j + 1 # j指向右孩子节点,不能互换
        if li[j] > tmp:
            li[i] = li[j]
            i = j  # 往下看一层
            j = 2 * i + 1
        else:  #tmp更大,把tmp放到i的位置上
            # li[i] = tmp  # 把tmp放到某一级领导那儿
            break
    li[i] = tmp # 把tmp放到叶子节点上
def head_sort(li):
    n = len(li)
    for i in range((n-2)//2, -1, -1):
        # i 表示建堆的时候调整的部分的根的下标
        sift(li, i, n-1)
    # 建堆完成了
    for i in range(n-1, -1, -1):
        # i 指向当前堆的最后一个元素
        li[0], li[i] = li[i], li[0]
        sift(li, 0, i-1) # i-1是新的high

li = [i for i in range(100)]
import random
random.shuffle(li)
print(li)
head_sort(li)
print(li)

堆排序时间复杂度

sift函数–>logn,走树的高度(深度)
head_sort函数–>nlogn
堆排序的时间复杂度:nlogn

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值