数据结构与算法基础(王卓)(28):排序概述(分类)、直接插入排序思路

news2024/9/19 11:10:06

目录

排序分类:(本章目录)

按数据存储介质:(学习内容)

内部排序:

外部排序:

按比较器个数:(学习内容)

串行排序:

并行排序:

按主要操作:(学习内容、里面的排序都会重点学)

比较排序:

基数排序:

按辅助空间:

原地排序:

非原地排序:

按稳定性:

稳定排序:

 非稳定排序:

按自然性:

插入排序

前置条件:

1. 直接插入排序

思绪脉络如下:


排序分类:(本章目录)


按数据存储介质:(学习内容)

内部排序:

数据量不大、数据在内存,无需内外存交换数据

外部排序:

数据量较大、数据在外存(文件排序)

外存排序时,要将数据分批调入内存来排序,中间结果还要及时放入外存,比较复杂

数据在内存当中放不下:

在内存当中排序一部分,排序完了以后把这些数据放进外存

在从外存当中再拿来一部分,在来进行(新一轮的)排序


按比较器个数:(学习内容)

串行排序:

单处理机(同一时刻比较一对元素)

并行排序:

多处理机(同一时刻比较多对元素)


按主要操作:(学习内容、里面的排序都会重点学)

比较排序:

插入排序、交换排序、选择排序、归并排序

基数排序:

不比较元素大小,仅根据元素本身的取值确定其有序位置


按辅助空间:

原地排序:

辅助空间用量为O(1),与参加排序的数据量大小无关

非原地排序:

辅助空间用量超过O(1),与参加排序的数据量大小有关


按稳定性:

稳定排序:

能使任何数值相等的元素,排序后相对次序不变

 非稳定排序:

数值相等的元素,排序后相对次序变化


按自然性:

自然排序:

输入数据越有序,排序的速度越快

非自然排序:

输入数据越有序,排序的速度越慢


插入排序


前置条件:

存储结构:以顺序表存储

#include<iostream>
using namespace std;

#define MAXSIZE 20  //记录最大个数
typedef int KeyType;  //关键字类型

typedef int InfoType;

//定义每个记录(数据元素)的结构
struct RecType
    //Record Type:每条记录的类型
{
    KeyType key;  //关键字
    InfoType otherinfo;  //其他数据项
};

struct SqList 
    //顺序表(的)结构
{
    RecType r[MAXSIZE + 1]; 
    //类型为【记录类型】的数组
    //r[0]一般做哨兵或缓冲区
    int length;  //顺序表长度
};

int main()
{

}

1. 直接插入排序

根据PPT,整理出

思绪脉络如下:

当然了,这里的“16”其实也只是一个虚指,他指向(代表)我们所有用来和7对比的数字(对象) 


根据PPT第23页所示意的,显然:

字母 i 用来表示的,是:每次循环之前有序表(顺序表)的队尾(序列尾部)

用字母 j 来表示(完成)“插入”的一整个流程/操作

再(又)根据PPT第27所提醒的,以及基于我们前面查找算法的前车之鉴:

我们这里需要使用哨兵


最终整理出程序的基本框架如下:

补充:加哨兵

对于诸多要插入的元素:
设立:

指针 i 指向顺序/有序序列队尾;
指针 j 指向新元素:

注:

原来设计的算法没有考虑到我们可以使用哨兵的便利性;
现在,我们已经不需要特别设立一个指针指向新插入的元素,只需要把新插入的元素放到哨兵里即可

那么现在,我们就确定了:

  • 把要新插入的元素放到哨兵(位序为0的位置)里
  •  j 指向我们在有序序列里的、拿来和新插入的元素比较的元素(的位置)
  • 比较哨兵(位序为0的)元素和指针 j 指向的元素
  1. 若大于等于:(哨兵元素大于等于指针 j 指向的元素)
    【交换元素】

    把所有 j 及 j 之后有序序列的元素全部往后移动一位

    (因为要插入的新元素已经放在哨兵里面了,我们不用担心后退一位会不会有数据丢失的影响)

    把哨兵元素插入到指针 j指向的位置

    注意:不要忘了(i++)!!!
     

  2. 若小于:(哨兵元素小于指针 j 指向的元素)
    【继续比较,和前面一位比较】

    j--;

  3. i++

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

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

相关文章

arduino学习笔记2

一.蜂鸣器输出实验 1.源代码 int buzzer2;//设置控制蜂鸣器的数字口对应板子上2口 void setup() { pinMode(buzzer,OUTPUT);//设置对应的输出模式 } void loop() { unsigned char i,j;//定义变量while(1) { for(i0;i<50;i)//输出一个频率的声音{ digitalWrite(buzzer,H…

2023年4月的12篇AI论文推荐

GPT-4发布仅仅三周后&#xff0c;就已经随处可见了。本月的论文推荐除了GPT-4以外还包括、语言模型的应用、扩散模型、计算机视觉、视频生成、推荐系统和神经辐射场。 1、GPT-4 Technical Report Sbastien Bubeck, Varun Chandrasekaran, Ronen Eldan, Johannes Gehrke, Eric…

密码技术知识总结

密码技术知识总结 1. 密码技术简介 对称密码&#xff1a;加密和解密时使用同一密钥的方式公钥密码&#xff1a;加密和解密时使用不同密钥&#xff0c;也称非对称密码单向散列函数&#xff1a;保证数据的完整性&#xff0c;检测数据是否被篡改过 散列值&#xff1a;又称哈希值…

k8s 控制器---Statefulset

1. Statefulset 控制器 StatefulSet 是为了管理有状态服务的问题而设计的。 1.1 什么叫有状态服务&#xff1f; StatefulSet 是有状态的集合&#xff0c;管理有状态的服务&#xff0c;它所管理的 Pod 的名称不能随意变化。数据 持久化的目录也是不一样&#xff0c;每一个 Pod …

Unity --- UGUI --- Rect Transform(矩形变换) --- 锚点及其相关应用

1.所有的UI物体都没有Transform组件&#xff0c;取而代之的是Transform组件的派生 --- Rect Transform(矩形变换) 2.Rect Transform和Transform一样都有旋转和缩放&#xff0c;它两之间的区别是&#xff1a; Rect Transform多了&#xff1a;a.Pibot轴心点&#xff1b;b.Ancho…

002 学习鸿蒙应用开发ArkTs语言

目录 一.ArkTs语言介绍 1.ArkTs语言概述 2.ArkTs语言特性 二.基本UI描述 1.基本概念 2.UI描述规范 无参数构造配置 有参数构造配置 属性配置 事件配置 子组件配置 三.状态管理 1.基本概念 2.页面级状态管理 State Prop Link Observed和ObjectLink数据管理 P…

​从底层技术分析如何调教你的ChatGPT?

相信很多人都已经在使用类ChatGPT的工具进行工作或者娱乐了&#xff0c;这里说的类ChatGPT的是指和ChatGPT相同或者相似功能的产品&#xff0c;包括国外的开源平替模型、百度的文心一言等&#xff0c;但是你真的会使用这些工具和应用吗&#xff1f;你使用的方法是正确的吗&…

Java ---内部类

&#xff08;一&#xff09;定义 将一个类 A 定义在另一个类 B 里面&#xff0c;里面的那个类 A 就称为 内部类 &#xff08; InnerClass &#xff09; &#xff0c;类 B 则称为 外部类&#xff08; OuterClass &#xff09;。广泛意义上的内部类一般来说包括这四种&#xff1…

【中级软件设计师】—(针对上午题)软件工程上(三十五)

【中级软件设计师】—&#xff08;针对上午题&#xff09;软件工程&#xff08;三十五&#xff09; 一、CMM 1 2 3 4 5 二、能力成熟度模型集成&#xff08;CMMI&#xff09; 6 7 8 9 三、软件过程模型 &#xff08;一&#xff09;、瀑布模型 &#xff08;二&#xff09;、V模…

第八章 项目进度管理

项目进度有8个过程 1、规划项目&#xff0c;进度管理&#xff08;计划&#xff09; 2、定义活动&#xff08;活动清单&#xff09; 3、排序活动 4、估算活动资源&#xff08;估算人力&#xff09; 5、估算活动时间 6、制定进度计划表 7、控制进度 规划项目进度管理 为实施项目进…

薪资17K是一个怎样的水平?来看看98年测试工程师的面试全过程…

我的情况 大概介绍一下个人情况&#xff0c;男&#xff0c;本科&#xff0c;三年多测试工作经验&#xff0c;懂python&#xff0c;会写脚本&#xff0c;会selenium&#xff0c;会性能&#xff0c;然而到今天都没有收到一份offer&#xff01;从年后就开始准备简历&#xff0c;年…

电容的基本知识

1、电容是电路中重要的元件&#xff0c;种类多、用途广&#xff0c;主要有插件类和贴片类两种。 2、电容主要特性参数:标称容量、耐压、误差、温度 2.1电容容量常用单位有微法《uF)、纳法《nF)、皮法《pF) 单位换算:1uF10^3nF10"6pF《电容的基本单位用法拉…

完成近4亿元C轮融资+自研底盘域控,本土线控制动玩家“拼”了

显然&#xff0c;线控制动赛道已经进入白热化竞争阶段。 高工智能汽车研究院监测数据显示&#xff0c;2022年中国市场&#xff08;不含进出口&#xff09;乘用车前装搭载线控制动系统&#xff08;One-Box&#xff0c;Two-Box&#xff09;上险交付合计497.39万辆&#xff0c;同…

java反序列化 cc链6 分析

前言 这里分析完cc1的两个以后&#xff0c;白日梦佬又介绍了cc6链&#xff0c;最主要的是这个链子不受jdk的版本影响&#xff0c;甚至不受cs版本的影响&#xff0c;这么说就是cs大部分都是可以使用cc链6&#xff0c;而且这个链子要简洁的很多&#xff0c;我一听这个好啊&#x…

springcloud-02

1、微服务概述 1.1 概念 1.2 架构演进 单体架构&#xff1a; 将业务的所有功能集中在一个项目中年开发&#xff0c; 打成一个jar包 优点&#xff1a;架构简单&#xff0c;部署成本低 缺点&#xff1a;耦合度高 分布式架构 按业务功能对系统进行拆分&#xff0c;每一个业务模块…

如何将项目提交到别人的仓库

大纲&#xff1a; 1、在gitee中克隆(clone)别人仓库的代码。 首先&#xff0c;进入别人的仓库&#xff0c;点击 克隆/下载 2、在你存放项目的文件夹下克隆你刚刚复制的代码 &#xff08;右键点击Git Clone即可&#xff09; 点击OK 就开始克隆了 克隆成功之后&#xff0c;文件上…

【HuggingGPT】Solving AI Tasks with ChatGPT and its Friends in Hugging Face

文章目录 所解决的问题&#xff1f;背景所采用的方法&#xff1f;取得的效果&#xff1f;问题所出版信息&#xff1f;作者信息&#xff1f;参考链接 所解决的问题&#xff1f; 当前的语言模型Large Language Models (LLMs)缺乏处理复杂信息的能力&#xff0c;像视觉&#xff0…

重学Java设计模式-行为型模式-中介者模式

重学Java设计模式-行为型模式-中介者模式 内容摘自&#xff1a;https://bugstack.cn/md/develop/design-pattern/2020-06-27-重学 Java 设计模式《实战中介者模式》.html#重学-java-设计模式-实战中介者模式「按照mybatis原理手写orm框架-给jdbc方式操作数据库增加中介者场景」…

Maven项目中出现【不再支持目标选项 1.5】的解决办法

1 快速解决【单项目】 本方法只适用于单个项目&#xff0c;新建项目使用maven还会出现问题。 在pom.xml配置&#xff1a; <properties><maven.compiler.source>11</maven.compiler.source><maven.compiler.target>11</maven.compiler.target>&l…

高并发高吞吐IO秘密武器——epoll池化技术

1、epoll函数详解 epoll是Linux特有的IO复用函数&#xff0c;使用一组函数来完成任务&#xff0c;而不是单个函数。 epoll把用户关心的文件描述符上的事件放在内核的一个事件表中&#xff0c;不需要像select、poll那样每次调用都要重复传入文件描述符集或事件集。 epoll需要…