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

news2024/9/21 20:41:55

文章目录

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

回顾

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

提要

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

排序基本概念

  • 将无序记录序列调整为有序记录序列的操作。
  • 例如,将下列记录序列:
    { 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.coloradmin.cn/o/2051303.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

虚幻5|布料模拟

打开骨骼网格体 1.Mass Prooerties 如果给角色施加风力&#xff0c;密度越大越难飘&#xff0c;相反密度越小飘动浮度也小 2.Material Proerties Edge Stiffness,对衣服的折痕处的调整&#xff0c;其值越大就越能维持原本的折痕&#xff0c;相反折痕就会变小&#xff0c;但…

【Mudo】实战项目之应用层模块

文章目录 前言正文1. Util1.1 File1.2 Url1.3 Str1.4 Infor 2. Http2.1 Request2.2 Response2.3 Context2.4 Server 尾序 前言 在上一篇文章当中&#xff0c;博主从代码的层面介绍了服务器模块的实现&#xff0c;最终封装出了一个传输层的TcpServer模块&#xff0c;那么在本篇…

中国篆刻艺术孙溟㠭凿木《未来之门》

孙溟㠭凿木《未来之门》 每人都有着自己对未来的期盼&#xff0c;未来并不遥远&#xff0c;下一秒就是未来&#xff0c;当下的一切好和一切的恶是暂时的&#xff0c;都会随着时间一秒一秒过去&#xff0c;走向未来&#xff0c;希望每人都能尽早打开未来之门&#xff0c;到达自己…

Arduino开源四足蜘蛛机器人制作教程

视频教程&#xff1a;手把手叫你做四足蜘蛛机器人——1零件介绍_哔哩哔哩_bilibili 一、项目介绍 1.1 项目介绍 Arduino主控&#xff0c;图形化编程&#xff0c;趣味学习 Arduino nano开发板舵机扩展底板 4.8V可充电电池&#xff0c;支持Arduino C语言编程和米思齐图形化编程…

Linux os下借助Qt+libvlc是实现多路拉取摄像头rtsp数据流并实时显示

前言 应客户方的一个实际项目需求&#xff0c;需要在Linux操作系统下拉取多路摄像头的RTSP数据流并实时显示。 该项目的硬件平台基于飞腾2000四核处理器与景嘉微显卡&#xff0c;搭载了Kylin V10操作系统。 当前景嘉微GPU最多支持同时连接16路摄像头&#xff0c;拉取1920x108…

C++中二叉搜索树的底层原理及实现

小编在学习完二叉搜索树(SearchBinaryTree)之后觉得虽然二叉搜索树不是很难&#xff0c;但是它对于后面学习C中的AVL树和红黑树及map和set的封装都有重要的作用&#xff0c;因此小编今天带给大家二叉搜索树的原理及实现&#xff0c;话不多说&#xff0c;开始学习&#xff01;~~…

<Linux> git

在使用git之前&#xff0c;要先在linux中安装git yum list | grep git yum install -y 文件名 在第一次安装git时&#xff0c;需要进行下面的操作 git config --global user.email "你的邮箱名" git config --global user.name "你想要的名字" 1. git clon…

LeetCode 热题 HOT 100 (038/100)【宇宙最简单版】

【动态规划】No. 0337 打家劫舍III【中等】&#x1f449;力扣对应题目指路 希望对你有帮助呀&#xff01;&#xff01;&#x1f49c;&#x1f49c; 如有更好理解的思路&#xff0c;欢迎大家留言补充 ~ 一起加油叭 &#x1f4a6; 欢迎关注、订阅专栏 【力扣详解】谢谢你的支持&a…

NGINX 常用内置变量

目录 $remote_addr 变量 $args 变量 $is_args 变量 $document_root 变量 $document_uri 变量 $host 变量 $limit_rate 变量 $remote_port 变量 $remote_port --显示客户端端口 $request_method 变量 --返回请求方式 $request_filename 变量 --返回请求实际路径 $request_uri…

eNSP 华为ACL配置

华为ACL配置 需求&#xff1a;公司保证财务部数据安全&#xff0c;禁止研发部门和互联网访问财务服务器&#xff0c;但总裁办不受影响 R1&#xff1a; <Huawei>sys [Huawei]sys Router1 [Router1]undo info-center enable [Router1]int g1/0/0 [Router1-GigabitEthern…

AI 工程应用 建筑表面检测及修复

文章目录 1 项目概述&#xff08;必写&#xff09;&#xff1a;2 技术方案与实施步骤2.1 模型选择&#xff08;必写&#xff09;&#xff1a;2.2 数据的构建&#xff1a;2.3 功能整合&#xff08;进阶&#xff09;&#xff1a; 3 实施步骤&#xff1a;3.1 环境搭建&#xff08;…

【Nginx】nginx的核心配置

1.nginx的文件启动 [rootNginx ~]# vim /lib/systemd/system/nginx.service [Unit] DescriptionThe NGINX HTTP and reverse proxy server Aftersyslog.target network-online.target remote-fs.target nss-lookup.target Wantsnetwork-online.target [Service] Typeforking P…

Python -- GUI图形界面编程—GUI编程实例 博主也在持续学习中[ 持续更新中!!! 欢迎白嫖 也求粉啊啊啊~ ]

本文介绍了GUI的图形界面编程&#xff08;相关视频是哔站上的应该搜这个题目就能找到&#xff09;&#xff0c;文章还是很基础的&#xff0c;反正我是小白从0开始&#xff0c;主要的结构tinkter库、重要组件简介&#xff08;这个不用死记硬背 用的时候再说&#xff09;、Label&…

诊断知识:DTC Status中pending位的使用

文章目录 前言OCC6的定义pending位的定义pending位的使用总结 前言 上一篇文章介绍了ConfirmedDTCLimit的使用&#xff0c;诊断知识&#xff1a;ConfirmedDTCLimit的使用&#xff0c;后面发现理解还是有问题的&#xff0c;其实原来的图画的没有问题&#xff0c;之前对OCC6理解…

【业余玩儿AI】Day 1

【业余玩儿AI】Day 1 实际是昨天的事儿了&#xff0c;记录以下 魔法 不管三七二十一&#xff0c;重新启用魔法&#xff0c;没有魔法这些事情肯定是不行滴 种子任务 把收藏了两个星期的短视频都看了一遍&#xff0c;挑了个种子任务&#xff0c;《本地部署Llama3.1》&#x…

【Web IDE】WebContainer容器在浏览器中启动运行nodejs并使用vite启动项目

参考了文章WebContainer/api 基础&#xff08;Web IDE 技术探索 一&#xff09; 在浏览器中运行vite的vue3项目 示例站点 最终效果 主要流程 加载WebContainer》加载代码压缩包>解压代码压缩包》生成文件树》挂载文件树》pnpm安装依赖》启动项目 代码 <script setup…

Unity动画模块 之 3D模型导入基础设置Model页签

本文仅作笔记学习和分享&#xff0c;不用做任何商业用途 本文包括但不限于unity官方手册&#xff0c;unity唐老狮等教程知识&#xff0c;如有不足还请斧正​ 创建模型&#xff1a;在 Unity 外部创建模型 - Unity 手册 导入模型&#xff1a;将模型导入 Unity - Unity 手册 1.…

算法的学习笔记—二叉树的镜像(牛客JZ27)

&#x1f600;前言 在二叉树相关的问题中&#xff0c;镜像操作是一个非常经典且常见的题目。本文将通过一道具体的题目&#xff0c;详细讲解如何将一棵二叉树转换为它的镜像&#xff0c;并提供实现该操作的Java代码示例。 &#x1f3e0;个人主页&#xff1a;尘觉主页 文章目录 …

【LVGL9学习笔记-2.添加百问网demo至工程模板】

添加百问网demo至工程模板 上一节使用codeBlocks运行了LVGL ,以此作为模板&#xff0c;将百问网的一些demo添加至该工程中 拷贝文件与配置文件至该目录下 打开工程包含文件 –>add files recusively –>add files 编译一次出现如下情况&#xff08;后面学到了再做解决…

[机器学习]全景指南:从基础概念到实战流程的全面解析

文章目录 1.引言1.1机器学习的重要性1.2机器学习的应用范围1.3本文的内容结构 2. 机器学习的基本概念与分类2.1 机器学习的定义2.2 机器学习的分类 4. 强化学习&#xff08;Reinforcement Learning&#xff09; 3. 机器学习的工作流程3.1 数据收集与准备1. 数据源与类型2. 数据…