算法通识|选择排序(简单选择排序、堆排序)

Before Writing

内容参考懒猫老师请多支持。

1 选择排序

1-1 简单排序的原理

  • 简单选择排序的主要思想是:每趟排序在当前待排序序列中选出关键码最小的记录,添加到有序序列中。
    在这里插入图片描述

1-2 堆选择排序的原理

  • 堆排序主要思想是:每次构造一个堆(二叉堆),将堆的根节点(最大值或最小值)添加到有序序列中。
  • 将节点先按照大根堆或小根堆进行排序,这样在堆中的序列基本有序。后面再对该堆树进行调整就会加快效率。

1-2-1 堆的定义

  • 堆是具有下列性质的完全二叉树:每个结点的值都小于或等于其左右孩子结点的值(称为小根堆),或每个节点的值大于左右孩子节点的值(称为大根堆)。
小根堆
  1. 小根堆的根节点是所有节点的最小值。
  2. 较小的节点靠近根节点但不绝对。
    在这里插入图片描述
大根堆
  1. 根节点的值是所有节点的最大值。
  2. 较大节点靠近根节点,但不绝对。
    在这里插入图片描述

1-2-2 堆和序列的关系

  • 将堆用顺序存储结构来存储,则堆对应一组序列。
  • 比如对于完全二叉树
    • 节点序号为i,左孩子序号为2i,右孩子2i+1,双亲节点i/2

在这里插入图片描述

1-2-3 基本思想

首先将待排序的记录序列构造成一个堆,此时,选出了堆中所有记录的最大者,然后将他从堆中移出,并将剩余的元素在调整称为堆,这样又找出了次大的记录,一次类推,直到堆中只有一个记录。

1-2-4 关键问题

  1. 如何由一个无需序列构建一个堆(初始堆)
  2. 如何处理对顶记录
  3. 如何调整剩余记录,成为一个新堆(重建堆)
堆调整

在一棵完全二叉树中,根节点的左右子树均是堆,如何调整根节点,使整个完全二叉树成为一个堆?


示例一:当一个树的左右子树都是大根堆堆,将其调整为大根堆
在这里插入图片描述

  • 也就是说,首先要将根节点的左右子树都调整称为大根堆(从下往上处理子树),然后再调整根节点(从上往下处理根节点)。
  • 可以见得堆排序流程就是根节点和左右孩子节点进行交换,其算法描述为:
    在这里插入图片描述
关键问题1
  • 如何将一个无需序列构建称为一个堆呢?
    sift函数被调用一次就完成一个子树的构建,需要用一个循环反复调用这个函数,才能把无需序列构建称为一个堆。
算法描述
// 从下往上进行处理,最后一个叶子结点的序号是n,n/2就是除去叶子节点的最后一个根节点
for (k = n/2; k >= 1; k --) {sift(r, k, n);
}

最后一个节点(叶子)的序号是n,最后一个分支节点即为节点n的双亲,其序号是n/2。假如我们要调整一个堆,首先就调整左右子树进行处理,而最后一个叶子结点就是我们要处理的第一步。随后依次向上处理根节点也就是n/2 -> n/2 - 1 -> n/2 -2 -> ... ... -> 1直到最终的根节点,整体描述如下图:
在这里插入图片描述

关键问题23

对堆顶进行记录:我们通过关键问题1对初始堆进行了构建,这个初始堆的特点是堆顶的元素是所有元素中最大的,接下来我们可以取出堆顶元素(最大元素)。然后重新对剩余的堆进行维护就能得到一个新的堆,将这个新的堆顶元素取出(次大元素)。

不断重复上面这个过程,就可以不断取得堆顶元素,最后获得排序后的序列。

算法描述:
  • k次处理堆顶是将堆顶记录r[1]与序列第n-k+1个记录r[n-k+1]交换。
  • r[1] <-> r[n-k+1]
// 元素个数为n,元素为r[]
void heapSort (int r[], int n) {// 对堆进行初始构建for (k = n/2; k >=1; k--) {sift(r[], k, n);}// 依次取出堆顶元素,并动态维护剩余堆for (k = 1; k < n; k++) {// 获取堆顶元素,放在最后switch(r[1], r[n-k+1]);// 对剩余元素进行维护sift(r[], 1, n-k);}
}

在这里插入图片描述

1-2-5 算法分析

  • 堆进行构建的时候遍历了每一个元素for(int k = end/2; k >= 1; k--),因此算法时间复杂度为O(n)。只是进行元素交换,空间复杂度为O(1)
  • 对堆不断维护并构建的过程时,我们一共维护了n次,每次都要进行近O(log(n))次比较。算法时间复杂度为O(n*log(n)),由于使用的是值交换而非递归,空间复杂度较低可以近似看做O(1)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/535138.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

spring boot 学习

目录 引言&#xff1a; 一、Spring Boot概述 二、Spring Boot的核心特性 1 自动配置 2 起步依赖 3 内嵌容器 4 监控与管理 三、Spring Boot的入门步骤 1 环境安装 2 创建项建 3 编写代码 1 启动类 2 控制器 3服务 4自动装配 5配置属性 6 JPA实体 4 运行与调试…

HarmonyOS-页面跳转Router实例演示

本文将以APP的登录和修改昵称为例演示官网的几种页面跳转、返回以及这些流程携带参数&#xff0c;实例的形式记录学习HarmonyOS的页面跳转。 “页面路由指在应用程序中实现不同页面之间的跳转和数据传递。HarmonyOS提供了Router模块&#xff0c;通过不同的url地址&#xff0c;…

C语言例2-1:从键盘输入两个整数,计算其乘积

代码如下&#xff1a; //从键盘输入两个整数&#xff0c;计算其乘积 #include<stdio.h> int main(void) /*主函数*/ {int n1, n2, result; /*定义保存两个整数及其乘积的变量*/printf("please inp…

让手机变相机,微单变全画幅的外设-斯莫格摄影套装开箱

大家好&#xff0c;我是Circaboy&#xff0c;近期给我的手机和相机入了一整套专业的摄影外设套装&#xff0c;然后我发现专业设备加持下的摄影着实是比我之前的要好很多&#xff0c;所以我就写了个文章做个简单的介绍和专业外设加持下的摄影对比。 本次入手的是斯莫格摄影套装…

海南众乐科技--元宇宙场景星球乐园与上海普思签署战略投资协议

3月12日,上海普思投资有限公司与海南众乐科技有限公司正式签署了战略合作协议,上海普思投资有限公司首期投资180万元资金支持推动元宇宙场景项目星球乐园的开发。双方本着互利共赢的原则、达成长期、全面性的战略合作关系,推动数字场景业务共同发展。 星球乐园是海南众乐科技有…

AI新工具(20240313) 世界上第一个完全自主的AI软件工程师Devin 已经开始接外包了;又一个开源本地知识库问答系统

1: Cognition AI Devin 世界上第一个完全自主的AI软件工程师Devin 已经开始接外包了 Devin是世界上第一个完全自主的AI软件工程师&#xff0c;具备长期推理和规划的能力&#xff0c;能够执行复杂的工程任务&#xff0c;包括学习、修复错误、与用户实时合作等。Devin可以学习并…

Mysql 学习(十七)事务隔离级别和MVCC

前提准备 首先创建一个表&#xff1a; CREATE TABLE hero (number INT,name VARCHAR(100),country varchar(100),PRIMARY KEY (number) ) EngineInnoDB CHARSETutf8;INSERT INTO hero VALUES(1, 刘备, 蜀);事务隔离级别 mysql 是一个 客户端 和 服务器架构的软件&#xff0c…

SQL进阶(四):Window 函数技巧

目录 1. 课前小问答1. 什么是 Windows 函数&#xff1f;&#xff08;窗口函数&#xff09;2. Window 函数的功能强大之处在哪里呢&#xff1f; 2. 开始之前的准备3. Window 函数核心&#xff1a;frame3.1 “轴”的范围控制&#xff1a;frame 参数✍️ 小练习 1&#xff1a; 尝试…

Android基础开发-选择图片,发送彩信

发送图片彩信案例&#xff1a; 按住加号&#xff0c;选择相册&#xff0c;把相册选择的图片加载的应用中&#xff0c;点击发送彩信&#xff0c;选择短信&#xff0c;发送彩信。 代码如下&#xff1a; package com.example.client;import androidx.activity.result.ActivityRe…

【Hibernate-Validate】常用注解

常用注解: NotNull:被注释的元素(任何元素)必须不为 nul, 集合为空也是可以的。NotEmpty:用来校验字符串、集合、map、数组不能为null或也不能为空(字符串传入空格也不可以)(集合需至少包含一个元素)NotBlank:被注释的字符串的必须非空&#xff0c;空格也不行&#xff0c;空字…

英伟达昨夜股市暴增7%!市场为何如此兴奋?GTC大会的预期效应?

会议之眼 快讯 美东时间2024年3月12日&#xff0c;英伟达公司&#xff08;NVIDIA Corp&#xff0c;股票代码&#xff1a;NVDA&#xff09;迎来了一次令人瞩目的大反弹&#xff01;展现出强劲的增长势头。根据数据&#xff0c;当日收盘价为919.13美元&#xff0c;比前一交易日的…

Realsense 相机SDK学习(一)——librealsense使用方法及bug解决(不使用Ros)

一.介绍 realsense相机是一个intel开发出来的一款深度相机&#xff0c;我之前使用他来跑过slam&#xff0c;也配置过他的驱动&#xff0c;在此附上realsense的相机驱动安装方法&#xff1a;Ubuntu20.04安装Intelrealsense相机驱动&#xff08;涉及Linux内核降级&#xff09; …