数据结构-顺序表的插入排序

        顺序表的排序可以看作数组排序的拓展。基本逻辑和数组排序的逻辑大同小异。

        由于顺序表中可以存放不同种的数据类型,进而和结构体排序又有相似之处。其中要注意的是(->)和(.)的区别。

        -> 符号是针对指针进行的操作,而 . 则是针对结构体的数据进行操作。

顺序表的初始化

const int M = 505;typedef struct{int key;            //关键元素int others;         //其他元素
}info;typedef struct{info r[M+1];        int length();       //表长
}SeqList,*PSeqList;

 直接插入排序

        分析:

        直接插入排序是最简单的排序。本质是将顺序表中的数据依次插入新的序列并使之有序的过程。

         在这个过程中,数字88的和88的相对位置没有发生改变,所以这个排序是稳定的。

void Insert_Sort(PSeqList PL)
{int p;for(int i = 2;i <= PL->length;i++){p = S->r[i];            //标记int j = i-1;while(PL->r[0].key < PL->r[j].key;{PL->r[j+1] = PL->r[j];j--;}PL->r[j+1] = p;         //插入}
}

        复杂度:

        空间复杂度

        在空间上只使用了一个变量 p 进行转存操作。所以空间复杂度是O(1)

        时间复杂度

        最好的情况是所有的数据已经有序,每次操作只需要把顺序表中的数据依次放入新序列即可。总的比较次数为n-1次,总的移动次数为2(n-1)次。因此时间复杂度是O(n)

        最坏的情况是所有的数据逆序排列,每次操作都需要把这次操作的数据与新序列中每一个数据进行比较。第i趟的比较次数为i+1,移动次数为i+2

        总的比较次数\sum_{i = 2}^{n}i\approx \frac{n^{2}}{2},总的移动次数\sum_{i = 2}^{n}(i+2)\approx \frac{n^{2}}{2}。因此时间复杂度是O(n^{2})

        一般情况下当处理第i个元素s_{i}时,有i个可能的插入位置。假设每个位置的可能性相同。均为1/i,比较次数为j,则平均的比较次数为\sum_{j=1}^{i}\frac{1}{i}\times j=\frac{i+1}{2}。而直接插入排序的总比较次数为\sum_{n}^{i=2}(\frac{i+1}{2})=\frac{n-1}{2}+\frac{(n-1)\times (n+2)}{2}\approx \frac{n^{2}}{4}。一般情况下平均比较次数和平均移动次数为同一数量级,所以直接插入排序的时间复杂度为O(n^{2})

二分插入排序

        分析:

        使用二分查找的思路和插入排序相结合,可以大幅度减少时间复杂度,并且是稳定的排序。

        二分查找:

        设顺序表中的结点按关键字递增,首先将待查值k和表中间位置上的结点关键字mid进行比较。若二者相等,则查找成功。否则,如果k<mid,则在表的前半部分继续利用二分查找,反之,则在表的后半部分二分查找,如此进行下去直至查找结束。

        二分查找的时间复杂度为O(\log_{2} n)

        二分插入排序代码:

void BinInsert_Sort(PSeqList PL)
{int l,h,mid;int p;for(int i = 2;i <= PL->length;i++){p = PL->r[i];                    //标记l = 1;                           //设置区间h = i-1;while(l <= h)                    //循环查找{mid = (l+h) >> 1;if(PL->r[0].key >= PL->r[mid].key)l = mid+1;               //查找右半部分else    h = mid - 1;         //查找左半部分}for(int j = i-1;j >= h+1;j--)    //顺序表插入操作PL->r[j+1] = PL->r[j];        PL->r[h+1] = p;                  //插入}
}

        复杂度:

        空间复杂度

        与直接插入排序相同为O(1)

        时间复杂度

        与直接插入排序相比,二分插入排序的比较次数与待排序的初始状态无关,只与记录的个数有关。

        插入第i个记录时,比较次数最多为\left \lfloor log_{2}i \right \rfloor +1=\left \lceil log_{2}i \right \rceil。所以n个记录排序的总比较次数为\sum_{i=1}^{n}\left \lceil log_{2}i \right \rceil \approx n \times log_{2}n

        n较大时,显然时间复杂度比直接插入排序的最大比较次数小得多,而大于直接插入排序的最小比较数。移动次数和直接插入排序相同。所以时间复杂度为O(n^{2})

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

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

相关文章

「动态规划」如何求最长摆动子序列的长度?

376. 摆动序列https://leetcode.cn/problems/wiggle-subsequence/description/ 如果连续数字之间的差严格地在正数和负数之间交替&#xff0c;则数字序列称为摆动序列。第一个差&#xff08;如果存在的话&#xff09;可能是正数或负数。仅有一个元素或者含两个不等元素的序列也…

明白这6个阶段,让你开启从普通员工到管理岗的进阶之路

面对职场的晋升通道&#xff0c;转型管理岗是很多普通职场人实现职业转型的一个可选项。然而&#xff0c;这条道路并非一蹴而就&#xff0c;而是需要经过一系列的阶段和努力&#xff0c;明白这些阶段将有助于职场人顺利走上管理岗位。 一、自我管理阶段。在这一阶段&#xff0…

中文域名费用是多少?

随着互联网的全球化和本地化趋势&#xff0c;中文域名作为文化多样性的体现&#xff0c;越来越受到企业和个人的欢迎。中文域名不仅便于中国用户的记忆和输入&#xff0c;而且也有助于提升品牌的本地化形象。本文将深入探讨中文域名的费用构成&#xff0c;以及在购买中文域名时…

设计软件有哪些?贴图插件篇(2),渲染100邀请码1a12

这次我们继续介绍一些贴图插件。 1、Texporter Texporter是3ds Max的一个插件&#xff0c;用于快速导出贴图。它允许用户一次性导出多个贴图通道&#xff0c;如漫反射、法线、置换等&#xff0c;以各种格式&#xff0c;如TGA、BMP、JPEG等。Texporter提供了简单易用的界面和灵…

react-native在IOS上集成百度地图详解

export default class BaiDuMapTest extends Component { render() { return ( ); } } const styles StyleSheet.create({ container: { flex: 1, justifyContent: ‘center’, alignItems: ‘center’, backgroundColor: ‘#F5FCFF’, }, welcome: { fontSize:…

告别手动邮件处理:使用imbox库轻松管理你的收件箱

imbox库简介&#xff1a; imbox是一个强大的Python库,专为与IMAP服务器交互而设计.IMAP&#xff08;Internet Message Access Protocol&#xff09;是一种用于电子邮件的标准协议,允许用户在远程服务器上管理邮件.imbox库通过IMAP协议与邮件服务器通信,帮助用户轻松地读取、搜索…

在昇腾开发环境合并baichuan2-13B模型的lora文件

概述 别人使用lora的方式对baichuan2-13b的模型进行了微调训练&#xff0c;希望我能部署到mindie服务中。 lora微调后生成的文件如下&#xff1a; # ls checkpoint-lora adapter_config.json optimizer.pt rng_state.pth special_tokens_map.json tokenizer_conf…

只知道无人机能航拍,你已经out啦!!!

无人机行业应用相当广泛&#xff0c;涵盖了航拍、植保、测绘、巡检、安防、物流等多个领域。并且随着科技的不断发展&#xff0c;无人机技术也在不断创新和完善。无人机行业的应用具有多重优势&#xff0c;这些优势使得无人机在众多领域中得以广泛应用并取得显著的成效。 航拍…

【投稿优惠|权威主办】2024年图像、地质测绘与遥感技术国际学术会议(ICIGSRST 2024)

【投稿优惠|权威主办】2024年图像、地质测绘与遥感技术国际学术会议&#xff08;ICIGSRST 2024&#xff09; 2024 International Conference on Image, Geological Surveying and Remote Sensing Technology&#xff08;ICIGSRST 2024&#xff09; ▶会议简介 2024年图像、地质…

应用监控eBPF 版调研

参考&#xff1a; https://www.toutiao.com/article/7327353509735596559/?appnews_articletamp1717488680&use_new_style1&req_id20240604161119838096AAE4AD4F44788E&group_id7327353509735596559&wxshare_count1&tt_fromweixin&utm_sourceweixin&…

vue自定义指令在同一个页面生效一次

vue自定义指令在同一个页面生效一次&#xff0c;在使用自定义指令做el-sele下滑分页时遇到vue自定义指令只生效了一次&#xff0c;是因为放在了v-if中使用&#xff0c;换成v-show就好了

kafka集群生产性能调优业务场景

kafka集群生产性能调优业务场景 Kafka 集群的生产性能调优可以通过多种途径实现,包括硬件配置优化、Kafka 配置参数调优、客户端配置优化、操作 系统和网络配置优化等。以下是详细的调优途径和适用场景: 1. 硬件配置优化 1.1 磁盘 SSD:使用 SSD 而不是 HDD 来提高磁盘 I/…

毕昇jdk教程

毕昇jdk教程指南链接&#xff1a;Wiki - Gitee.com

springboot 网上商城系统-计算机毕业设计源码08789

摘 要 随着互联网趋势的到来&#xff0c;各行各业都在考虑利用互联网将自己推广出去&#xff0c;最好方式就是建立自己的互联网系统&#xff0c;并对其进行维护和管理。在现实运用中&#xff0c;应用软件的工作规则和开发步骤&#xff0c;采用Java技术建设网上商城系统。 本设…

算法课程笔记——点积叉积

算法课程笔记——点积叉积

Kotlin设计模式:享元模式(Flyweight Pattern)

Kotlin设计模式&#xff1a;享元模式&#xff08;Flyweight Pattern&#xff09; 在移动应用开发中&#xff0c;内存和CPU资源是非常宝贵的。享元模式&#xff08;Flyweight Pattern&#xff09;是一种设计模式&#xff0c;旨在通过对象重用来优化内存使用和性能。本文将深入探…

docker不要乱改工作路径,可能啥都会丢

买的国内某云服务器&#xff0c;系统盘比较小&#xff0c;数据盘稍微大点&#xff0c;啥都安装好了才发现docker实例存在了系统盘里面&#xff0c;寻思挪一下吧&#xff0c;好家伙&#xff0c;挪完了啥都丢了&#xff0c;我是这样移动的。 1.先把docker停了 sudo systemctl …

2023年零信任落地关键词:整合、身份、普及

2023年&#xff0c;全球企业纷纷加快了落地零信任的步伐。虽然落地的功能、落地的场景不尽相同&#xff0c;但企业对零信任的诉求、落地零信任的优先级却殊途同归&#xff0c;不同的零信任产品的应用场景也日益明晰。 全面整合和协同运行&#xff0c;是2023年企业用户对零信任…

一文搞懂Linux多线程【上】

目录 &#x1f6a9;引言 &#x1f6a9;再次理解页表 &#x1f6a9;初识线程 &#x1f6a9;线程和pthread库 &#x1f680;线程创建 &#x1f6a9;线程的资源共享问题 &#x1f6a9;线程的优缺点 &#x1f6a9;引言 今天&#xff0c;我们开始学习Linux中的线程部分。Lin…

大语言模型(LLMs)能够进行推理和规划吗?

大语言模型&#xff08;LLMs&#xff09;&#xff0c;基本上是经过强化训练的 n-gram 模型&#xff0c;它们在网络规模的语言语料库&#xff08;实际上&#xff0c;可以说是我们文明的知识库&#xff09;上进行了训练&#xff0c;展现出了一种超乎预期的语言行为&#xff0c;引…