每天学习一个基础算法之插入排序

news2024/9/22 13:27:54

目录

前言:

一、插入排序的基本思路与实现方法

1、基本思路

2、实现方法

二、插入排序的执行过程示意图

三、插入排序的实现代码

插入排序代码主体(以接口函数的形式)

测试部分(主函数调用)

  四、对插入排序复杂度的分析

背景知识:

 1、插入排序的时间复杂度

2、插入排序的空间复杂度

总结:


前言:

本文从概念理解、思路分析、画图举例,代码实现、复杂度分析等多个方面对插入排序进行详细的讲解,包含插入排序的基本思路与实现方法执行过程示意图代码,以及对时间和空间复杂度的分析多个方面的知识。目录清晰,重点标红,部分加粗,方便各位初学者和复习者注意、搜索。

一、插入排序的基本思路与实现方法

1、基本思路

插入排序的基本思路:每次取出一个待排序的数据元素,按其大小插入到之前已经排行序的数据集中,直到全部待排序插入完毕。

2、实现方法

实现方法:从左边数第二个数(索引(或下标)为1的位置)开始取数,然后与其坐标所以的数进行比较,如果取的值比左边的值小就与其交换(重复交换以达到类似插入的效果),重复取数与比较直到排序完成为止。

二、插入排序的执行过程示意图

 橙色部分为上轮改变部分,箭头表示该轮要插入的数据与位置。

三、插入排序的实现代码

插入排序代码主体(以接口函数的形式)

//插入排序的实现
static void insert_sort(int arr[], int sz)
{
    int i = 0;
    for (i = 1; i < sz; i++)
    {
        int j = 0;
        //从外层循环下标值比较到第一个数
        for (j = i - 1; j > -1; j--)
        {
            if (arr[j + 1] < arr[j])//若找到较小值
            {
                //较小值左移
                int tmp = arr[j + 1];
                arr[j + 1] = arr[j];
                arr[j] = tmp;
            }
            else
            {
                break;
            }
        }
    }
}

测试部分(主函数调用)

#include <stdio.h>
int main()
{
    int arr[] = { 10,7,4,9,6,1,8,3,2,5 };
    int sz = sizeof(arr) / sizeof(arr[0]);
    insert_sort(arr, sz);
    int i = 0;
    //对排序完成的数组进行输出
    for (i = 0; i < sz; i++)
    {
        printf("%d ",arr[i]);
    }
 
}

  四、对插入排序复杂度的分析

背景知识:


时间复杂度:表示算法中基本操作(一般表示重复执行的操作)的执行次数,并不需要计算精确的执行次数,而只需要计算大概执行次数。 但我们计算时一般会尽可能先算其精确值,再通过大O的渐进表示法,取对变化趋势影响最大的部分。

空间复杂度:空间复杂度是对一个算法在运行过程中临时占用存储空间大小的度量,算的是额外创建变量的个数,也使用大O的渐进表示法。

 1、插入排序的时间复杂度

前置条件:设排序数据个数为N

最好情况:每个数都在恰好的位置(数据已排序好),即每个数只形式比较一次,不出现交换

只有N次,时间复杂度为O(N)

最坏情况:数组是逆序,精确计算:

1+2+3+……+(N-2)+(N-1)

=n(n-1)/2

时间复杂度为O(N^2)

2、插入排序的空间复杂度

所使用的空间不随数据大小变化,始终为一个常数,故空间复杂度为O(1)。

总结:

总结这三期博客,发现其实冒泡排序、选择排序、插入排序三种排序方式虽然思路与实现方式都不相同,但从复杂度方面来看其实是差不多相同的,可以说都已经将数据排序算法精炼到了极致,不必比较其优劣,但对我们来说理解多种方法是必要的,它不仅能拓宽我们的思路,也对我们的逻辑思维能力有很大的提升作用。

若想要对冒泡排序与选择排序进行了解可以看看我前两期博客。

每天学习一个基础算法之冒泡排序

http://t.csdnimg.cn/VQmZs

每天学习一个基础算法之选择排序

http://t.csdnimg.cn/t4SLh

每日一学,今天你又超过了百分之九十九的人。

如果本篇文章对你有帮助,请点个关注和赞吧!

若是对本文有什么独特的见解,也可以在评论区进行讨论。

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

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

相关文章

Vue中使用el-table自定义序号翻页后又从1开始没有连续

在 ​​el-table​​​ 中&#xff0c;自定义序号列在翻页后会重新从 1 开始是因为每页的数据是重新渲染的&#xff0c;没有保留之前的序号。如果您希望在翻页后保持连续的序号&#xff0c;可以使用 ​​index​​ 属性来获取全局的行索引。 以下是一个示例&#xff0c;演示如…

string题(下)最后一个单词的长度

string类题目&#xff08;下&#xff09; 题目&#xff1a;字符串里面最后一个单词的长度&#xff08;牛客网&#xff09; 然后我们不假思索写出这样的代码&#xff1a; #include <iostream> using namespace std;int main() {string str;cin>>str;size_t pos st…

VS环境中使用QT、OpenCV进行简易图像处理(附源码)

1.背景 在VS2022中&#xff0c;结合QT开发框架&#xff0c;使用OpenCV开源图像处理库&#xff0c;实现在QT界面中完成简易的图像处理&#xff0c;这里展示采用了灰度化处理&#xff0c;其它图像处理操作依据具体场景编写即可。 2.图像格式问题 在QT中&#xff0c;采用的是QI…

详细解读版本控制工具Git+常见命令实操演示

1.版本控制的重要性 版本控制允许开发者查看文件和项目的整个历史记录&#xff0c;包括每次更改的详细记录。在团队项目中&#xff0c;版本控制使得多个开发者可以同时工作在同一个项目上&#xff0c;而不会相互干扰。当引入的错误导致项目出现问题时&#xff0c;版本控制可以…

中吉自动售货机netty对接出货慢问题解决

情景说明&#xff1a; 采购中吉自动售货机&#xff0c;自研对接java代码对接&#xff0c;使用netty方式。&#xff08;注&#xff1a;有需要对接java对接中吉设备代码的可以关注我们的公众号&#xff0c;联系我们。 对接中吉自动售货机&#xff0c;下发 出货指令&#xff0c;要…

代码随想录算法训练营第四十天| 深搜与广搜理论基础以及模板代码

今天是算法学习第四十天&#xff0c;主要的学习内容是深度优先搜索和广度优先搜索&#xff0c;以及对于模板题的讲解。 深度优先搜索&#xff08;DFS) 深搜其实原理就是先往一个方向搜索&#xff0c;直到遇到终止条件再回头。所以深度优先搜索的关键就是递归和回溯。 对于深…

超声波清洗机哪个品牌好用?实用性强的超声波眼镜清洗机推荐

眼镜一类的物品都很难清理&#xff0c;特别容易刮花&#xff0c;此外还有小件的首饰&#xff0c;也很难通过常规的清洁方式去除污渍&#xff0c;这时候就要用到超声波清洗机&#xff0c;这两年这种小工具很流行&#xff0c;而超声波清洗机便是其中的一种热门清洁神器&#xff0…

Kafka命令详解:从零开始,掌握Kafka集群管理、主题操作与监控的全方位技能,理解每一条命令背后的逻辑与最佳实践

本文主要是关于Kafka的命令详解&#xff0c;每个命令都进行了非常详细的注释&#xff0c;帮助大家能更好的理解这些命令背后的含义&#xff0c;从底层去理解&#xff0c;如果大家喜欢&#xff0c;请多多点赞关注&#xff0c;欢迎评论&#xff01; 为大家推荐几篇比较好的Kafka文…

【selenium点选下拉框】解决无法选中对应选项的问题

需求 使用selenium点击下拉框&#xff0c;选中【是】选项。 代码 方法1 # 点击下拉框 driver.find_element(xpath,//*[id"basicProcessDetail"]/div[2]/div[2]/div[1]/div/div[2]/div/div/div/div[1]/div[2]/form/div[11]/div[1]/div/div/div[1]/div[1]/div/i).…

扫描件转word如何操作?分享3个转换技巧,简单高效

在日常工作中&#xff0c;总会遇到扫描件格式的PDF文档&#xff0c;为了方便整理&#xff0c;修改和使用&#xff0c;我们经常需要将扫描件转成可编辑的Word文档&#xff0c;那有哪些方法可以将扫描件转换成Word呢&#xff1f;本期小编就给大家分享3个转换技巧&#xff0c;简单…

mysql索引的基本原理

1.索引的基本原理 是为了提高数据检索效率&#xff0c;通过排列好的数据结构&#xff08;通常是二叉树或B-Tree&#xff09;来加快查找过程。1.1 优势 是帮助mysql获取数据的一种高效数据结构&#xff0c;并且是有序的&#xff1b;提高数据的检索效率&#xff0c;降低数据库的…

用IP地址申请SSL证书可行吗?

在当今社会&#xff0c;互联网的安全非常重要&#xff0c;SSL&#xff08;Secure Sockets Layer&#xff09;证书作为保障网站安全的重要工具&#xff0c;能够加密网站与用户之间的数据传输&#xff0c;保护用户隐私&#xff0c;提升网站信任度等。然而&#xff0c;传统的SSL证…

【计算机组成原理】四、指令系统:3.汇编语言

5.汇编语言 文章目录 5.汇编语言5.1考试要求&#xff08;408&#xff09;x86汇编语言5.2地址码x86架构CPU&#xff0c;有哪些寄存器&#xff1f;总结 5.3操作码5.3.1算术运算5.3.2逻辑运算5.3.3其他 5.4循环分支5.4.1 jmp直接跳转指令5.4.2 jxxx条件跳转指令分支C→汇编循环C→…

Openstack 与 Ceph集群搭建(下): Openstack部署

文章目录 文章参考部署节点准备1. 修改Host文件与hostname名称2. 安装NTP软件3. 网卡配置信息4. 开启Docker共享挂载5. 安装python虚拟环境6. 安装kolla-ansible7. 加载Ansible galaxy requirements Openstack 安装前预配置1. 配置密码2. 配置multinode文件3. 修改全局配置文件…

2.Easy-Paas部署

目录 1.部署方式 2.docker-compose部署 1.1.准备docker环境 1.2.部署中间件 3.k8s部署 1.部署方式 docker-compose部署&#xff08;单节点&#xff09;k8s部署自研ops 2.docker-compose部署 1.1.准备docker环境 参考&#xff1a;二进制安装docker-CSDN博客 1.2.部署中…

安科瑞储能双向计量表DTSD1352-CT/CF 双向电量复费率统计

安科瑞徐赟杰 Hey科技迷们&#xff0c;你们是否对能源管理的新纪元充满好奇&#xff1f; 今天咱们来聊聊这款颠覆性的黑科技——安科瑞储能双向计量表DTSD1352&#xff01; 想象一下&#xff0c;一个能够掌控能量流动&#xff0c;无论是输入还是输出&#xff0c;都了如指掌的…

Thread类的基本用法(详解版)

什么是线程&#xff1f; 线程是操作系统能够进行调度的最小单位&#xff0c;通常被视为轻量级的进程。线程在同一进程中共享进程的资源&#xff08;如内存&#xff0c;打开的文件&#xff0c;网络等&#xff09;&#xff0c;但每一个线程都有自己的执行栈、程序计数器和局部变…

项目管理中什么是项目质量管理?

所有项目经理都易于犯下的通病便是产生无谓的乐观&#xff0c;误以为质量会自然而然地融入项目之中。然而&#xff0c;在实际操作中&#xff0c;我们必须明确界定、监控并管理项目管理质量。 项目质量管理的核心在于确保项目质量。这被称为项目的第四个约束&#xff0c;经理们必…

澄志创投马良骏:营销技术行业下一个关键词是合并与整合 | 中国广告营销行业资本报告深访①

日前&#xff0c;澄志创投发布了《中国广告营销行业资本报告2022》&#xff0c;投中信息提供独家数据支持&#xff0c;Marteker联合撰写。报告围绕广告营销行业的资本运作等话题&#xff0c;采访了行业资深人士。 马良骏Joshua&#xff08;澄志创投创始人&#xff09; 问&#…

Module not found: Can‘t resolve ‘tls‘/Module not found: Can‘t resolve ‘net‘

最近使用nextjs开发了一套系统&#xff0c;包含了前后端&#xff0c;但是前后端的界限其实没有那么清晰&#xff0c;很多地方都引入了公共的内容&#xff0c;甚至互相引入了其模块的内容 然后周五时在前端引入了一个方法&#xff08;该方法在前端的模块里面定义的&#xff0c;之…