首页 > 编程语言 >算法学习笔记六一堆排序

算法学习笔记六一堆排序

时间:2023-12-27 15:24:44浏览次数:42  
标签:六一 temp 元素 堆排序 li 算法 排序 节点

目录

什么是堆排序

堆排序(Heap Sort)是一种基于二叉堆数据结构的排序算法。它的主要思想是将待排序的序列构建成一个大顶堆(或小顶堆),然后反复从堆顶取出最大(或最小)元素,将剩余的元素重新调整为一个新的堆,再重复取出堆顶元素的过程,直到排序完成。

算法思想

  1. 构建堆:将待排序序列构建成一个大顶堆(或小顶堆)。从最后一个非叶子节点开始,对每个非叶子节点进行以下操作:
    比较该节点与其左右子节点的大小,找出最大(或最小)的元素。
    如果最大(或最小)元素不是该节点本身,则交换它们的位置。
    然后,以交换后的子节点为根节点,继续向下调整,直到堆的末尾。
  2. 排序:此时堆顶元素是最大(或最小)的元素,将其与堆的末尾元素交换位置,然后将剩余的元素重新调整为一个新的堆。重复这个过程,直到堆中只有一个元素。

堆排序的关键在于构建堆和调整堆的过程。构建堆的时间复杂度为O(n),其中n是待排序序列的长度。排序过程中,需要进行n-1次交换操作,每次交换后需要调整堆的结构,时间复杂度为O(logn)。因此,堆排序的总时间复杂度为O(nlogn)。

代码示例

# sift函数用来调整堆
def sift(li, low, high):
    '''
    low: 二叉数的根节点
    high: 二叉树的最后一个节点
    '''
    i = low  # i最开始指向根节点
    j = 2 * i + 1  # 左孩子
    temp = li[low]
    while j <= high:  # 只要j位置有数
        if j + 1 <= high and li[j + 1] > li[j]:  # 如果右孩子有且比较大
            j = j + 1  # j指向这个较大的右孩子
        if li[j] > temp:  # 如果当前根节点比最大的孩子大
            li[i] = li[j]  # 把这个孩子放入根节点
            i = j  # 往下看一层
            j = 2 * i + 1
        else:
            break
    li[i] = temp  # 最后把temp放入到叶子节点上


def heap_sort(li):
    n = len(li)
    # 先建堆
    for i in range((n - 2) // 2, -1, -1):
        # i表示舰堆时跟节点的下标,从第一个非叶子节点,也就是最后一个元素n-1的根节点(n-1-1)/2
        sift(li, i, n - 1)
    # 建堆完成,开始排序
    for i in range(n - 1, -1, -1):
        # i指向当前堆的最后一个元素
        li[i], li[0] = li[0], li[i]  # 为了节省空间,依次把根节点最大元素和最后一个元素交换
        sift(li, 0, i - 1)  # 前第i个元素已为有序

标签:六一,temp,元素,堆排序,li,算法,排序,节点
From: https://www.cnblogs.com/chase-youth/p/17929534.html

相关文章

  • 堆排序
    步骤1.将数组构建成二叉树,n的左右孩子是2n+1、2n+2.2.将二叉树转化成堆(父节点大于等于两个孩子节点(大顶堆),父节点小于等于两个孩子节点(小顶堆)),时间复杂度O(n)。3.将堆顶和最后一个元素交换(此时堆顶就是最大值),事件复杂度O(logn)。4.按需要最大的n个值来执行(n-1)次步骤3。(时......
  • 人工智能算法原理与代码实战:强化学习的基础概念和实践
    1.背景介绍强化学习(ReinforcementLearning,RL)是一种人工智能(AI)的子领域,它旨在解决如何让智能体(如机器人)在环境中取得最佳性能的问题。强化学习的核心思想是通过与环境的互动来学习,而不是通过传统的监督学习方法。在这种学习过程中,智能体通过试错学习,并根据收到的奖励来调整其行为......
  • 人工智能算法原理与代码实战:自然语言处理与文本生成
    1.背景介绍自然语言处理(NLP)和文本生成是人工智能领域中的两个重要分支。随着大数据、深度学习和自然语言理解技术的发展,NLP和文本生成技术已经取得了显著的进展。这本书将揭示NLP和文本生成算法的原理,并提供详细的代码实例,帮助读者理解和实践这些算法。本书将涵盖以下主题:自然语言......
  • 人工智能算法原理与代码实战:强化学习与智能交互
    1.背景介绍强化学习(ReinforcementLearning,RL)是一种人工智能(ArtificialIntelligence,AI)技术,它通过在环境中进行交互来学习如何做出最佳决策。强化学习的核心思想是通过在环境中进行试错来学习如何做出最佳决策,而不是通过传统的监督学习方法来学习。强化学习的应用范围广泛,包括......
  • 遗传算法在网络优化领域的应用
    1.背景介绍遗传算法(GeneticAlgorithm,GA)是一种基于生物进化过程的优化算法,它通过模拟自然界中的生物进化过程来寻找最优解。遗传算法的核心思想是通过对种群中的个体进行评价、选择、交叉和变异等操作,逐步找到最优解。在网络优化领域,遗传算法广泛应用于各种问题的解决,如路径规划、......
  • 磁盘调度算法、虚拟内存、抖动(颠簸)、堆栈访问速度、内存分配、内存交换、编码(ASCII、U
    常见的几种磁盘调度算法:读写一个磁盘块的时间的影响因素有:......
  • 人工智能大模型原理与应用实战:增强学习算法优化
    1.背景介绍人工智能(ArtificialIntelligence,AI)是一门研究如何让计算机模拟人类智能的学科。在过去的几十年里,人工智能研究的主要重点是规则-基于和知识-基于的系统。然而,随着数据量的增加和计算能力的提高,机器学习(MachineLearning,ML)和深度学习(DeepLearning,DL)技术在人工智能......
  • 人脸识别技术演进:从几何算法到深度学习的深度剖析
    本文全面探讨了人脸识别技术的发展历程、关键方法及其应用任务目标,深入分析了从几何特征到深度学习的技术演进。关注TechLead,分享AI全维度知识。作者拥有10+年互联网服务架构、AI产品研发经验、团队管理经验,同济本复旦硕,复旦机器人智能实验室成员,阿里云认证的资深架构师,项目管......
  • 组合优化的奥秘:揭示算法奥妙
    1.背景介绍组合优化是一种常见的优化问题,它涉及到寻找一组变量的最佳组合,以满足某种目标函数的要求。这类问题广泛存在于计算机视觉、自然语言处理、机器学习等领域。在这篇文章中,我们将深入探讨组合优化的核心概念、算法原理和实例代码。组合优化问题通常可以用以下形式表示:$$\be......
  • RapidMiner的机器学习算法解析:一一对比和应用
    1.背景介绍RapidMiner是一个开源的数据科学和机器学习平台,它提供了一系列的数据挖掘和机器学习算法,以及一些工具来帮助数据科学家和分析师更快地构建和部署机器学习模型。在这篇文章中,我们将深入探讨RapidMiner中的机器学习算法,揭示它们的原理、应用和优缺点。2.核心概念与联系在Ra......