• (二十四)数据结构-选择排序


    选择排序(每一趟在待排序元素中选择关键字最小(或最大)的元素加入有序子序列)分为:

    1. 简单选择排序
    2. 堆排序

    1.1简单选择排序算法思想

    每一趟中在待排元素中选取关键字最小的元素加入有子序列

    举例说明:
    在这里插入图片描述

    1. 第一趟从待排序列中,左往右依次找到最小元素(13),接着与起始元素(49)进行交换,得到13 38 65 97 76 49 27 49
    2. 第一趟从待排序列中(38 65 97 76 49 27 49)从左往右依次找到最小元素(27),接着与待排序列起始元素(38)进行交换,得到13 27 38 65 97 76 49 38 49
    3. 依次列推
    4. 当出现两个49,则将最靠近的进行交换
    5. 当出现剩一个元素则不再处理

    1.2算法性能分析

    算法的时间复杂度不会因为给出的序列而改变,n个元素就需要n-1趟处理
    算法是不稳定的
    适用性:顺序表、链表
    在这里插入图片描述

    二、堆排序(重要)

    2.1.1“堆”的概念

    在这里插入图片描述

    大根堆:在完全二叉树中,根>= 左、右(堆顶元素关键字最大)
    小根堆:在完全二叉树中,根<= 左、右

    在这里插入图片描述

    2.1.2建立大根堆

    思路:把所有非终端结点(i<=[n/2])都检查一遍,是否满足大根堆的要求,如果不满足,则进行调整
    1. 非中断结点=8/2=4,我们处理i<=4的结点,从后往前进行处理,处理编号结点中最大的。
      1. 第一个处理的结点为4号结点(值为9),检查9是否满足大根堆的要求
      2. 发现他只有左孩子,且左孩子的值比她更大,因此不满足大根堆特性
      3. 因此将当前结点(9)与更大的一个孩子(32)进行互换

    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述

    1. 处理结点编号为3的结点(78),将当前结点78与更大的一个孩子(87)结点进行交换
      在这里插入图片描述

    2. 处理结点编号为2的结点(17),若有两个孩子结点都比当前结点的值更大,那么将当前结点17与最大的一个孩子(45)结点进行交换
      在这里插入图片描述

    3. 处理结点编号为1的结点(53)时,会让87替换53,但是会使得53出现“下坠”,可能会导致下一层的子树不符合大根丢的要求,则需要在继续进行往下调整,当无法继续下坠,即调整完整
      在这里插入图片描述

    2.1.3基于大根堆进行排序

    思想:每一趟将堆顶元素加入到有序子序列(与待排序列中的最后一个元素交换),将待排序元素序列再次调整为大根堆
    1. 首先堆顶元素(87)换到末尾,09元素换到堆顶,后面87这个元素将不再改变,接着将除87以外的元素看成一个堆
    2. 当我们把09元素换到堆顶,接下来我们要对09元素进行“下坠”调整
    3. 依次列推
    4. 直到只剩下最后一个待排元素,则不再调整
      在这里插入图片描述
      在这里插入图片描述

    在这里插入图片描述

    2.2算法效率分析

    若左右孩子一样大,我们将左孩子进行交换
    堆排序是不稳定的
    在这里插入图片描述
    在这里插入图片描述

    2.3知识点回顾

    在这里插入图片描述

    2.4堆排序的插入删除

    关键字对比次数:

    1. “上升”调整只需对比关键字一次
    2. “下降”调整需要对比关键字两次,也可能只需对比1次

    在这里插入图片描述

  • 相关阅读:
    Hadoop
    朗强:高清视频HDMI延长器的特点
    webpack5基础和配置
    基于Google Vertex AI 和 Llama 2进行RLHF训练和评估
    Firefox使用SSH代理配置
    Python PyQt 程序设置图标
    基于SSH的计算机在线测评考试系统
    【跟小嘉学 Rust 编程】二十九、Rust 中的零拷贝序列化解决方案(rkyv)
    3.2 Keepalived安装部署
    css问题
  • 原文地址:https://blog.csdn.net/weixin_45579930/article/details/126557884