热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

堆排序(heap-sort):堆排序过程图解

本文主要分享【堆排序过程图解】,技术文章【堆排序(heap-sort)】为【fiveym】投稿,如果你遇到数据结构和算法相关问题,本文相关知识或能到你。堆排序过程图解堆排序(heap-sor

本文主要分享【堆排序过程图解】,技术文章【堆排序(heap-sort)】为【fiveym】投稿,如果你遇到数据结构和算法相关问题,本文相关知识或能到你。

堆排序过程图解

堆排序(heap-sort) 堆排序前传--树与二叉树二叉树的基础知识二叉树的存储方式什么是堆堆的向下调整性质堆排序的过程向下调整的函数实现 堆排序的实现堆排序中的topk问题

堆排序前传–树与二叉树 树是一种数据结构 比如:目录结构树是一种可以递归定义的数据结构树是由n个结点组成的集合: 如果n=0,那这是一棵空树如果n>0,那么存在1个结点作为数的根结点,其他结点可以分为m个集合,每个集合本身有事一棵树。

堆排序(heap-sort):堆排序过程图解

一些概念:

根结点(A),叶子结点(树的末端B,C,H,I,P,Q,K,L,M,N)树的深度(高度),就是最深有几层:4层树的度,就是分出的最多的那个的,A:6度孩子结点/父结点子树:E,I,J,P,Q 二叉树的基础知识 度不超过2的树每个结点最多有两个孩子结点两个孩子结点被区分为左孩子结点和右孩子结点

堆排序(heap-sort):堆排序过程图解


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

完全二叉树:叶结点只能出现在最下层和次下层,并且最下面一层的结点都集中在该层最左边的若干位置的二叉树。

堆排序(heap-sort):堆排序过程图解

二叉树的存储方式

二叉树的存储方式(表示方式)

链式存储方式

顺序存储方式

父节点和左孩子结点的编号下标有什么关系?

0-1 1-3 2-5 3-7 4-9父节点为i: i—>2i+1

父节点和右孩子结点的编号下标有什么关系?

0-2 1-4 2-6 3-8 4-10父节点为i:i—>2i+2

堆排序(heap-sort):堆排序过程图解

什么是堆

堆:一种特殊的完全二叉树结构

大根堆:一棵完全二叉树,满足任一结点都比其孩子结点大小根堆:一棵完全二叉树,满足任一结点都比其孩子节点小

堆排序(heap-sort):堆排序过程图解

堆的向下调整性质 假设根节点的左右子树都堆,但根结点不满足堆的性质可以通过一次向下的调整来将其变成一个堆

堆排序(heap-sort):堆排序过程图解

堆排序的过程

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
            
    else:
        li[i] = tmp   #把tmp放到叶子结点上

堆排序的实现

时间复杂度为:O(ologn)

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

    else:
        li[i] = tmp   #把tmp放到叶子结点上

def heap_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
print(li)

heap_sort(li)
print(li) 
堆排序中的topk问题 现在有n个数,设计算法得到前k大的数。(k def sift(li, low, high): i = low j = 2 * i + 1 tmp = li[low] while j <= high: if j + 1 <= high and li[j+1] < li[j]: j = j + 1 if li[j] < tmp: li[i] = li[j] i = j j = 2 * i + 1 else: break li[i] = tmp def topk(li, k): heap = li[0:k] for i in range((k-2)//2, -1, -1): sift(heap, i, k-1) #建堆 for i in range(k, len(li)-1): if li[i] > heap[0]: heap[0] = li[i] sift(heap, 0, k-1) #遍历列表中所有元素 for i in range(k-1, -1, -1): heap[0], heap[i] = heap[i], heap[0] sift(heap, 0, i-1) #出数 return heap import random li = list(range(1000)) random.shuffle(li) print(topk(li, 10))

本文《堆排序(heap-sort)》版权归fiveym所有,引用堆排序(heap-sort)需遵循CC 4.0 BY-SA版权协议。


推荐阅读
  • Python中程序员的面试题有哪些
    小编给大家分享一下Python中程序员的面试题有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • Go语言实现堆排序的详细教程
    本文主要介绍了Go语言实现堆排序的详细教程,包括大根堆的定义和完全二叉树的概念。通过图解和算法描述,详细介绍了堆排序的实现过程。堆排序是一种效率很高的排序算法,时间复杂度为O(nlgn)。阅读本文大约需要15分钟。 ... [详细]
  • 本文介绍了使用Spark实现低配版高斯朴素贝叶斯模型的原因和原理。随着数据量的增大,单机上运行高斯朴素贝叶斯模型会变得很慢,因此考虑使用Spark来加速运行。然而,Spark的MLlib并没有实现高斯朴素贝叶斯模型,因此需要自己动手实现。文章还介绍了朴素贝叶斯的原理和公式,并对具有多个特征和类别的模型进行了讨论。最后,作者总结了实现低配版高斯朴素贝叶斯模型的步骤。 ... [详细]
  • 十大经典排序算法动图演示+Python实现
    本文介绍了十大经典排序算法的原理、演示和Python实现。排序算法分为内部排序和外部排序,常见的内部排序算法有插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。文章还解释了时间复杂度和稳定性的概念,并提供了相关的名词解释。 ... [详细]
  • Python使用Pillow包生成验证码图片的方法
    本文介绍了使用Python中的Pillow包生成验证码图片的方法。通过随机生成数字和符号,并添加干扰象素,生成一幅验证码图片。需要配置好Python环境,并安装Pillow库。代码实现包括导入Pillow包和随机模块,定义随机生成字母、数字和字体颜色的函数。 ... [详细]
  • Python教学练习二Python1-12练习二一、判断季节用户输入月份,判断这个月是哪个季节?3,4,5月----春 ... [详细]
  • 颜色迁移(reinhard VS welsh)
    不要谈什么天分,运气,你需要的是一个截稿日,以及一个不交稿就能打爆你狗头的人,然后你就会被自己的才华吓到。------ ... [详细]
  • 很多时候在注册一些比较重要的帐号,或者使用一些比较重要的接口的时候,需要使用到随机字符串,为了方便,我们设计这个脚本需要注意 ... [详细]
  • 假设我有两个数组A和B,其中A和B都是mxn.我现在的目标是,对于A和B的每一行,找到我应该在B的相应行中插入A的第i行元素的位置.也就是说,我希望将np.digitize或np. ... [详细]
  • 关于如何快速定义自己的数据集,可以参考我的前一篇文章PyTorch中快速加载自定义数据(入门)_晨曦473的博客-CSDN博客刚开始学习P ... [详细]
  • 1关于字符串相邻的两个或多个字符串字面值(引号引起来的字符)将会自动连接到一起:str_catpython!str_cat输出:python!把很长 ... [详细]
  • 一、死锁现象与递归锁进程也是有死锁的所谓死锁:是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作 ... [详细]
author-avatar
safecaps
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有