数据结构与算法--插入排序与选择排序

文章目录

    • 回顾
    • 提要
    • 排序基本概念
      • 排序的分类
      • 排序算法的稳定性
      • 排序算法的性能指标
      • 内排序
    • 排序方法
    • 直接插入排序
      • 直接插入排序的要点
      • 直接插入排序的实现
      • 直接插入排序性能分析
      • 直接插入排序的适用情景
    • 简单选择排序
      • 简单选择排序的要点
      • 简单选择排序的执行过程
      • 简单选择排序的实现
      • 简单选择排序性能分析
      • 简单选择排序的适用情景
    • 总结

回顾

  • 哈希存储结构通过哈希函数确定关键字的存储地址。
  • 哈希表设计重点包括哈希函数构造和冲突解决方法。
  • 哈希函数构造方法:直接定址法、除留余数法、数字分析法等。
  • 解决冲突的方法:开放定址法、线性探查法、平方探查法等。

提要

  • 排序的基本概念。
  • 直接插入排序。
  • 简单选择排序。

排序基本概念

  • 将无序记录序列调整为有序记录序列的操作。
  • 例如,将下列记录序列:
    { 52, 49, 80, 36, 14, 58, 61, 23, 97, 75 }
  • 调整为递增序列:
    { 14, 23, 36, 49, 52, 58, 61, 75, 80, 97 }
  • 通常指定记录的某个数据项作为关键字进行排序。
  • 排序关键字可以重复。

排序的分类

  • 按待排序记录所在位置:内部排序和外部排序。
    • 内部排序:待排序记录存放在内存
    • 外部排序:排序过程中需对外存进行访问的排序
  • 按排序依据原则:插入排序、交换排序、选择排序、归并排序。
    • 插入排序:直接插入排序、折半插入排序
    • 交换排序:冒泡排序、快速排序
    • 选择排序:简单选择排序、堆排序
    • 归并排序:2-路归并排序

排序算法的稳定性

  • 稳定的排序算法保持具有相同关键字记录的相对次序。
  • 如原序列中,ki = kj 且 ki 在 kj 之前,排序后 ki 仍在 kj 之前,即为稳定。
  • 排序前:{ 8, 3, 5, 2, 4, 9, 5, 6 }
  • 排序后:{ 2, 3, 4, 5, 5, 6, 8, 9 } 稳定
  • 排序后:{ 2, 3, 4, 5, 5, 6, 8, 9 } 不稳定

排序算法的性能指标

  • 时间开销:比较次数和移动次数。
    • 比较:关键字之间的比较;
    • 移动:将记录从一个位置移动到另一个位置。
  • 空间开销:辅助存储空间。
  • 算法的稳定性。

内排序

  • 待排记录存放在内存中进行排序。
  • 排序对象
    • 针对关键字(排序码)的序列
    • 排序算法默认以顺序表为存储结构
    • 非递减有序
  • 后面讲述的插入排序、交换排序、选择排序、归并排序等都是指的内排序。

排序方法

  • 学习排序方法的思想、实现、时间性能、空间性能、稳定性和适用情景。

直接插入排序

  • 序列分为有序区和无序区,每次将无序区的第一个元素插入到有序区的适当位置。

直接插入排序的要点

  • 初始时,第一个元素构成有序区,其余为无序区。
  • 每趟排序,待插入元素为无序区的第一个元素。
  • 从后向前比较,插入元素大于当前元素则后移。
  • 无序区为空时,排序结束。
  • 在这里插入图片描述
  • 基本操作:比较和移动的次数,决定了排序的时间性能。
    • 待排序列为“正序”时,比较和移动的次数最少;
    • 待排序列为“逆序”时,比较和移动的次数最多。
  • 算法评价
    • 时间复杂度:T(n)=O(n²)
    • 空间复杂度:S(n)=O(1)。只使用i、j和tmp共3个辅助变量,与问题规模n无关。

直接插入排序的实现

void InsertSort(ElemType L[], int len) {int i, j;ElemType tmp;for (i = 1; i < len; i++) {tmp = L[i];for (j = i - 1; j >= 0; j--) {if (tmp < L[j]) L[j + 1] = L[j];else break;}L[j + 1] = tmp;}
}

在这里插入图片描述

直接插入排序性能分析

  • 时间复杂度:( T(n) = O(n^2) )
  • 空间复杂度:( S(n) = O(1) )

直接插入排序的适用情景

  • 稳定排序算法,适用于基本有序或记录较少的情况。
  • 移动操作总是发生在相邻的元素之间,因而是一种稳定的排序算法。
  • 算法简单、容易实现,适用于待排序记录基本有序或待排序记录较少时。
  • 当待排序的记录个数较多时,大量的比较和移动操作使算法的效率降低。

简单选择排序

  • 序列分为有序区和无序区,每次选择无序区关键字最小的元素与第一个元素交换。

简单选择排序的要点

  • 初始时,有序区为空,全部元素处于无序区。
  • 每趟选择无序区最小关键字元素与第一个元素交换。
  • 无序区剩下最后一个元素时,排序结束。
  • 在这里插入图片描述

简单选择排序的执行过程

  • 通过多趟选择,逐步构建有序区。
  • 在这里插入图片描述

简单选择排序的实现

void SelectSort(ElemType L[], int len) {int i, j, min;ElemType tmp;for (i = 0; i < len - 1; i++) {min = i;for (j = i + 1; j < len; j++)if (L[j] < L[min]) min = j;if (min != i) {tmp = L[i];L[i] = L[min];L[min] = tmp;}}
}

在这里插入图片描述

简单选择排序性能分析

  • 时间复杂度:( T(n) = O(n^2) )
  • 空间复杂度:( S(n) = O(1) )
    在这里插入图片描述

简单选择排序的适用情景

  • 不稳定排序算法,适用于记录个数较多时,移动操作次数较少。

总结

  • 介绍了排序算法的概念、分类以及直接插入排序和简单选择排序的排序过程、实现和性能分析。

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

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

相关文章

分布式锁:Mysql实现,Redis实现,Zookeeper实现

目录 前置知识 Mysql实现分布式锁 1.get_lock函数 Java代码实现&#xff1a; 2.for update尾缀 Java代码实现&#xff1a; 3.自己定义锁表 Java代码实现&#xff1a; 4.时间戳列实现乐观锁 Java代码实现&#xff1a; Redis实现分布式锁 Zookeeper实现分布式锁&#…

完整搭建windows下mysql8.0源码编译调试环境!

背景&#xff1a; 前段时间一直在看mysql相关的博客&#xff0c;所以对源码起了浓厚的兴趣&#xff0c;所以尝试通过vmware和vscode在windosw环境中搭建一套编译调试的环境~ 看了一下网上的搭建教程基本杂乱无章&#xff0c;想要从零跟着搭建出一个完善的调试环境也不是易事&…

Leetcode3232. 判断是否可以赢得数字游戏

Every day a Leetcode 题目来源&#xff1a;3232. 判断是否可以赢得数字游戏 解法1&#xff1a;3232. 判断是否可以赢得数字游戏 用一个 sum1 统计个位数的和&#xff0c;sum2 统计十位数的和。 只要 sum1 和 sum2 不相等&#xff0c;Alice 拿大的就能赢得这场游戏。 代码…

Maven的依赖范围

依赖的jar包&#xff0c;默认情况下&#xff0c;可以在任何地方使用&#xff0c;可以通过scope来设置作用范围 作用范围&#xff1a; 主程序范围有效&#xff08;main文件夹范围内&#xff09;测试程序范围有效&#xff08;test文件夹范围内&#xff09;是否参与打包运行&…

一次日志记录中使用fastjson涉及到ByteBuffer的教训

背景 目前本人在公司负责的模块中&#xff0c;有一个模块是负责数据同步的&#xff0c;主要是将我们数据产线使用的 AWS Dynamodb 同步的我们的测试QA 的环境的 MongoDB 的库中&#xff0c;去年开始也提供了使用 EMR 批量同步的功能&#xff0c;但是有时候业务也需要少量的数据…

【OpenCV_python】凸包检测 轮廓特征 直方图均衡化 模板匹配 霍夫变换

凸包特征检测 凸包就是图像的最小外接多边形&#xff0c;通过图像的轮廓点&#xff0c;找到距离最远的两个点的直线&#xff0c;根据直线找到距离最远的下一个点&#xff0c;直到所有的点被包围在多边形内 读取图像二值化找图像的轮廓获取凸包点的坐标绘制凸包点 convexHull 获…

程序员如何写PLC程序

PLC是可编程逻辑控制器的简称&#xff0c;常用的编程语言是IEC61131-3&#xff08;梯形图、结构化文本、指令表、功能块、顺序功能图&#xff09;和西门子的SCL。程序员常用的编程语言是JS、Java、Python、C/C、Go等。PLC广泛采用编程工具有codesys、博图等。程序员常用的编程工…

敏捷架构在数字时代的应用:从理论到实践的全面指南

在数字化转型和技术变革的浪潮中&#xff0c;企业面临着不断提升敏捷性和应对复杂环境的挑战。敏捷架构在数字时代的应用不仅从理论层面阐述了敏捷架构的基本原理&#xff0c;还为企业提供了详细的实践指南&#xff0c;帮助企业从理论走向实际操作。本文将从理论与实践的双重视…

STM32——CAN通讯基础知识

CAN 协议简介 CAN 是控制器局域网络 (Controller Area Network) 的简称&#xff0c;它是由研发和生产汽车电子产品著称的德国 BOSCH 公司开发的&#xff0c;并最终成为国际标准(ISO11519以及ISO11898),是国际上应用最广泛的现场总线之一。差异点如下&#xff1a; 高速CAN可以达…

YOLOv8_det/seg/pose/obb推理流程

本章将介绍目标检测、实例分割、关键点检测和旋转目标检测的推理原理,基于onnx模型推理,那么首先就需要了解onnx模型的输入和输出,对输入的图片需要进行预处理的操作,对输出的结果需要进行后处理的操作,这部分内容在我的另一个专栏《YOLOv8深度剖析》中也有介绍,如果对YO…

《机器学习》一元、多元线性回归的实现 No.4

一、一元线性回归实现 先直接看完整代码&#xff1a; import pandas as pd import matplotlib.pyplot as plt from sklearn.linear_model import LinearRegressiondate pd.read_csv(data.csv) #导入数据plt.scatter(date[广告投入],date[销售额]) # 用散点图展示数据 plt.sh…

实训第二十八天(haproxy与利用python实现mysql主从的读写分离)

1、练习 [rootnat ~]# ipvsadm -d -t 192.168.10.101:3306 -r 10.0.0.22:3306 #删除真实主机 nat: [rootnat ~]# ifconfig ens33: flags4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 10.0.0.10 netmask 255.255.255.0 broadcast 10.0.0.25…

【JVM】深入理解类加载机制(二)

深入理解类加载机制 HSDB工具的使用 Hotspot Debugger(HSDB):JDK原生自带 以Windows系统为例&#xff0c;jdk8的环境&#xff0c;在jdk的lib目录下&#xff0c;启动之前&#xff0c;你需要确保你进入的lib目录和你当前的JAVA_HOME配置的JDK是相同的&#xff0c;否则可能会出现…

2.1 文件内容差异对比方法

2.1 文件内容差异对比方法 文件内容差异对比方法2.1.1 两个字符串的差异对比2.1.2 生成美观的HTML格式文档2.1.3 对比nginx 配置文件差异代码封装 文件内容差异对比方法 介绍如何通过difflib模块实现文件内容差异对比。difflib作为Python的标准库模块无需安装&#xff0c;作用…

2024年运营技术与网络安全态势研究报告:遭遇多次网络威胁的比例暴增

随着 OT 组织不断在其业务环境中集成各种数字工具和技术&#xff0c;它们面临的安全挑战也日益变得愈加复杂和多样化。正如 NIST 指出&#xff0c; “虽然安全解决方案旨在解决典型 IT系统中的一些问题&#xff0c;但将这些相同的解决方案引入不同的 OT 环境时&#xff0c;必须…

ruoyi-vue-pro项目新建模块的接口都报404错误

目录 1. 问题所示2. 原理分析3. 解决方法1. 问题所示 新建模块之后,该模块后端的请求都是返回404,如图所示: 2. 原理分析 抛开这个项目,对于路径请求不成功,返回404 主要的步骤如下: 检查路由配置: 确保在路由配置文件中添加了新模块的路由 例如,在Spring Boot中,这…

vue3+ts 前端word文档下载文件时不预览直接下载方法(支持 doc / excel / ppt / pdf 等)

前端word文档下载文件时不预览直接下载方法支持 doc / excel / ppt / pdf 等 根据需要&#xff0c;要实现一个下载文档的需要 最简单的方法就是使用a标签 如果是相同域可以直接下载&#xff0c;但如果是不同域的&#xff0c;就会先打开一个预览页&#xff0c;在预览页再点下载…

StarRocks Lakehouse 快速入门——Apache Paimon

StarRocks Lakehouse 快速入门指南为您提供了湖仓技术概览&#xff0c;旨在帮助您迅速掌握其核心特性、独特优势和应用场景。本指南将指导您如何高效地利用 StarRocks 构建解决方案。文章末尾&#xff0c;我们集合了来自阿里云、饿了么、喜马拉雅和同程旅行等行业领导者在 Star…

Eureka原理与实践:构建高效的微服务架构

Eureka原理与实践&#xff1a;构建高效的微服务架构 Eureka的核心原理Eureka Server&#xff1a;服务注册中心Eureka Client&#xff1a;服务提供者与服务消费者 Eureka的实践应用集成Eureka到Spring Cloud项目中创建Eureka Server创建Eureka Client&#xff08;服务提供者&…

什么叫日志门面

日志门面&#xff0c;是门面模式的一个典型的应用。 门面模式&#xff08;Facade Pattern&#xff09;&#xff0c;也称之为外观模式&#xff0c;其核心为&#xff1a;外部与一个子系统的通信必须通过一个统一的外观对象进行&#xff0c;使得子系统更易于使用。 就像Log4j、Lo…