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

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

  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次

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值