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

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

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

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

顺序表的初始化

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})

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

《计算机英语》Unit 1 Computer Overview 计算机概述

期末试卷组成 1、选择20道 2、判断20道 3、词汇翻译&#xff08;单词词组&#xff0c;参照课后习题&#xff09; 4、翻译2道&#xff08;一道原题&#xff0c;参照作业&#xff09; SectionA About Computer 关于计算机 algorithm n. 算法 operate v.…

6.19长难句打卡

The Flatiron School, where people pay to learn programming, started as one of the many coding bootcamps that’s become popular for adults looking for a career change. 人们在Flatiron学校里花钱学习编程&#xff0c;且Flatiron学校也成为在寻求职业变化的成年人之中…

超越招聘技术人才目标的最佳技术招聘统计数据

研究发现&#xff0c;难以找到的人才比以往任何时候都更难找到&#xff1a;根据新人才委员会招聘调查报告&#xff1a;2024年难以找到的人才的战略和战略&#xff0c;60%的受访者表示&#xff0c;熟练人才的招聘时间比一年前长。调查进一步揭示了以下关于招聘技术的关键事实&am…

与亚马逊云科技深度合作,再获WAPP、ISV认证

上半年&#xff0c;VERYCLOUD睿鸿股份加入亚马逊云科技的WAPP&#xff08;Well-Architected Partner Programs&#xff09;和ISV加速计划&#xff08;ISV Accelerate Program&#xff09;&#xff0c;为客户带来更坚实优质的海外云服务。 Well-Architected 获得WAPP这项认证代表…

揭秘,如何轻松选出那瓶专属于你的心动红酒?

红酒&#xff0c;这个充满神秘与浪漫的液体&#xff0c;总能在不经意间触动我们的味蕾&#xff0c;引发无尽的遐想。然而&#xff0c;面对琳琅满目的红酒选择&#xff0c;如何挑选一瓶适合自己的红酒呢&#xff1f;今天&#xff0c;就让我们一起探讨这个话题&#xff0c;并特别…

艾斯迪克MPU60压力控制单元维修

一、艾斯迪克压力控制单元故障识别与诊断 首先&#xff0c;当出现ESTIC压力控制单元MPU60故障时&#xff0c;我们需要进行故障识别与诊断。这通常包括检查设备的显示屏、指示灯以及传感器等部分&#xff0c;以确定故障的具体位置。此外&#xff0c;还可以使用专业的故障诊断工具…

Conda创建与激活虚拟环境(指定虚拟环境创建位置)

1.Conda优势 Conda是一个开源的软件包管理系统和环境管理系统&#xff0c;主要用于在不同的计算环境中安装和管理软件包和其依赖项。它最初是为Python而设计的&#xff0c;但现在也可以用于管理其他语言的软件包。 Conda提供了对虚拟环境的支持&#xff0c;这使得用户可以在同…

解锁分布式云多集群统一监控的云上最佳实践

作者&#xff1a;在峰 引言 在当今数字化转型加速的时代&#xff0c;随着混合云、多云多集群环境等技术被众多企业广泛应用&#xff0c;分布式云架构已成为众多企业和组织推动业务创新、实现弹性扩展的首选&#xff0c;分布式云容器平台 ACK One&#xff08;Distributed Clou…

Python应用开发——30天学习Streamlit Python包进行APP的构建(9)

st.area_chart 显示区域图。 这是围绕 st.altair_chart 的语法糖。主要区别在于该命令使用数据自身的列和指数来计算图表的 Altair 规格。因此,在许多 "只需绘制此图 "的情况下,该命令更易于使用,但可定制性较差。 如果 st.area_chart 无法正确猜测数据规格,请…

llama系列模型学习

一、目录 llama1 模型与transformer decoder的区别llama2 模型架构llama2 相比llama1 不同之处llama3 相比llama2 不同之处llama、llama2、llama3 分词器词表大小以及优缺点采用的损失函数是什么&#xff1f;为什么Layer Norm 改为RMS Norm?如何消除模型幻觉&#xff1f; 二…

Mac电脑FTP客户端推荐:Transmit 5 for Mac 中文版

Transmit 5是一款专为macOS平台设计的功能强大的FTP&#xff08;文件传输协议&#xff09;客户端软件。Transmit 5凭借其强大的功能、直观易用的界面和高效的性能&#xff0c;成为需要频繁进行文件传输和管理的个人用户和专业用户的理想选择。无论是对于新手还是经验丰富的用户…

KT6368A芯片使用后出现扫描不到蓝牙,2脚持续高电平串口没有反应

KT6368A蓝牙芯片连接问题 问题描述&#xff1a; 蓝牙芯片使用一段时间后&#xff0c;出现扫描不到蓝牙&#xff08;部分芯片出现&#xff0c;出现概率挺高&#xff09;&#xff0c;更换新的芯片后就可以扫描到蓝牙 上电后检测2引脚&#xff08;下图BLE_LINK引脚&#xff09;…

使用vant4+vue3制作电商购物网站

一、前言 1.本项目基于vant4vue3构建&#xff0c;默认友友们已具备相关知识&#xff0c;如不具备&#xff0c;请友友们先去了解相关该概念 2.项目数据来源于开源框架 新峰商城 在此指出 3.此项目目的在于帮助友友们了解基本的用法&#xff0c;没有涉及太多的逻辑操作。 二、…

宝塔面板一键迁移项目站点教程

此插件仅用于将当前机器数据迁移出去&#xff0c;数据接收机器无需安装此插件。 注意事项&#xff1a; 当前教程仅适用《宝塔一键迁移API版本》插件&#xff0c;版本号 >3.0。 推荐迁移面板版本 > 6.9.5&#xff0c;低版本迁移可能存在部分数据无法迁移成功。 面板版…

Future You:对话未来的自己

是由麻省理工开发的 AI 聊天机器人&#xff0c;通过填写一系列表单和上传自己的照片&#xff0c;即可看到老年后的自己并与之对话。

怎么将图片压缩调小?在线压缩图片的4种快捷方法

压缩图片是日常很常用的一个图片处理功能&#xff0c;现在拍摄和制作的图片都比较大&#xff0c;在使用时经常会受到影响。在遇到无法上传、传输过慢的问题时会降低工作效率&#xff0c;所以掌握一招快速压缩图片是非常重要的。通过下面这篇文章来给大家介绍一下在线图片压缩的…

193.回溯算法:组合总和(力扣)

代码解决 class Solution { public:vector<int> res; // 当前组合的临时存储vector<vector<int>> result; // 存储所有符合条件的组合// 回溯函数void backtrcing(vector<int>& nums, int target, int flag, int index) {// 如果当前组合的和超过了…

预备役二招算法测试题解

这次题目出的都是一些偏向于基础的题目&#xff0c;就是一些简单的模拟&#xff0c;思维&#xff0c;以及基础算法&#xff08;二分&#xff0c;前缀和&#xff09; &#xff08;点击题目标题&#xff0c;进入原题&#xff09; 我是签到题 题解&#xff1a;就是说给你 t 组数据…

【MDK5问题】:MDK中的jlink正常下载,但是板子却没有任何反应

1、问题现象&#xff1a; 1、在MDK5中&#xff0c;jlink配置项如下图&#xff0c;没有看到异常情况和配置&#xff1a; 2、点击load下载到板子上&#xff0c;出现的现象是&#xff0c;下载提示下载完成&#xff0c;但是&#xff0c;板子却没有任何反应&#xff08;程序实现应该…

音频傅里叶变换(基于开源kissffs)

主要参考资料&#xff1a; 深入浅出的讲解傅里叶变换&#xff08;真正的通俗易懂&#xff09;: https://zhuanlan.zhihu.com/p/19763358 推荐开源项目&#xff1a;KISS FFT&#xff1a; https://blog.csdn.net/gitblog_00031/article/details/138840117 数字硅麦数据的处理&…