【数据结构初阶】直接插入排序

最近浅学了直接插入排序,写个博客做笔记!笔记功能除外若能对读者老爷有所帮助最好不过了!

直接插入排序是插入排序的一种,那么介绍直接插入排序之前先介绍一下常见的排序算法!

目录

1.常见的排序算法

2.直接插入排序

 3.直接插入排序的时间复杂度和空间复杂度


1.常见的排序算法

那么常见的排序算法包括但不限于以下:

那么鼠鼠今天只是浅介绍一下插入排序中的直接插入排序!

2.直接插入排序

鼠鼠这篇博客拿排升序来讲解直接插入排序!

直接插入排序的思想:

当插入第i(i>=1)个元素时,前面的array[0],array[1],…,array[i-1]已经排好序,此时用array[i]的排序码与 array[i-1],array[i-2],…的排序码顺序进行比较,找到插入位置即将array[i]插入,原来位置上的元素顺序后移。

说简单一点就是:有一个本身有序的数组,往这个数组插入一个数据,使得这个数组继续有序。那么如何插入就是关键,鼠鼠给各位举一个例子:

鼠鼠上面举的栗子就是让原本有序的数组插入一个数据后继续有序了:下标为0到下标为end的数据组成的数组本身有序,插入下标位end+1的数据,经过上图的操作让数组继续有序。 

其实上图展现的就是直接插入排序的“单趟”,即下标为0到下标为end的数据组成的数组本身有序,插入下标位end+1的数据,经过上图的操作让数组继续有序,用代码写出“单趟”来如下:

int end;int tmp = a[end + 1];for (end; end >= 0; end--){if (tmp < a[end]){a[end + 1] = a[end];}else{break;}}a[end + 1] = tmp;

那么我们只要控制住下标end就可以完成直接插入排序的完整代码,我们想想:

有一个乱序且数据个数为n的数组让我们排序。

当下标end等于0时,取乱序数组的第1个数据充当有序数组,只有1个数据我们当然可以看成是有序的,插入下标为end+1的数据(“前1个有序,第2个插入”),经过“单趟”前2个数据排列有序!

当下标end等于1时,取乱序数组前2个数据,这2个数据已经变为有序的了,插入下标为end+1的数据(“前2个有序,第3个插入”),经过“单趟”前3个数据排列有序!

当下标end等于2时,取乱序数组前3个数据,这3个数据已经变为有序的了,插入下标为end+1的数据(“前3个有序,第4个插入”),经过“单趟”前4个数据排列有序!

…………………………

当下标end等于n-2时,取乱序数组前n-1个数据,这n-1个数据已经变为有序的了,插入下标为end+1的数据(“前n-1个有序,第n个插入”),经过“单趟”前n个数据排列有序,就是乱序数组变成有序的了!

注释:我们要搞清楚数组下标是从0开始的,下标为0的数据是第1个数据,下标为1的数据是第2个数据……

这个动图很好展示了直接插入排序。

那么一个循环控制end,让“单趟”变为“多趟”,我们的直接插入排序就搞定了,代码如下:

//直接插入排序排升序
void InsertSort(int* a, int n)
{for (int j = 0; j < n - 1; j++){int end=j;int tmp = a[end + 1];for (end; end >= 0; end--){if (tmp < a[end]){a[end + 1] = a[end];}else{break;}}a[end + 1] = tmp;}
}

鼠鼠来浅浅运用一下:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>//直接插入排序排升序
void InsertSort(int* a, int n)
{for (int j = 0; j < n - 1; j++){int end=j;int tmp = a[end + 1];for (end; end >= 0; end--){if (tmp < a[end]){a[end + 1] = a[end];}else{break;}}a[end + 1] = tmp;}
}void PrintArray(int* a, int n)
{for (int i = 0; i < n; i++){printf("%d ", a[i]);}printf("\n");
}int main()
{int a[] = { 0,1,5,4,7,8,6,4,88,3,5, };PrintArray(a, sizeof(a) / sizeof(a[0]));InsertSort(a, 11);PrintArray(a, sizeof(a) / sizeof(a[0]));return 0;
}

没有问题的! 

 3.直接插入排序的时间复杂度和空间复杂度

根据插入排序的思想,很明显直接插入排序的时间复杂度是O(N^2)。

当然当我们想要排升序时,待排序的数组本身是升序或者解决升序的情况下,时间复杂度差不多是O(N)。也就是说待排序数组本身越接近有序(我们期待的有序),直接插入排序的时间效率越高。

不过时间复杂度考虑的是“最坏情况”,所以说直接插入排序时间复杂度是O(N^2)。

直接插入排序空间复杂度是O(1)。

感谢阅读!

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

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

相关文章

57. 【Android教程】相机:Camera

相机现在已经不仅仅是手机必备神器了&#xff0c;甚至相机的拍照质量已经是很多人买手机的首选条件了。而对于相机而言主要有两大功能&#xff1a;拍照片和拍视频。Android 为此两种方式&#xff1a; 相机 intent相机 API 本节我们就一起来看看相机的具体用法。 1. 打开 Camer…

C# Linq中的自定义排序

1.开发过程中&#xff0c;会遇到OrderBy/OrderByDescending排序无法满足的情况&#xff0c;此时就需要自定义排序&#xff0c;按照想要的排序规则取排序&#xff0c;比如订单的状态等等。 2.自定义泛型比较器代码如下&#xff1a; /// <summary>/// 自定义泛型比较器(用…

train_gpt2_fp32.cu - layernorm_forward_kernel3

源码 __global__ void layernorm_forward_kernel3(float* __restrict__ out, float* __restrict__ mean, float* __restrict__ rstd,const float* __restrict__ inp, const float* __restrict__ weight,const float* __restrict__ bias, int N, int C) {cg::thread_block bl…

【北京迅为】《iTOP-3588从零搭建ubuntu环境手册》-第8章 安装编译所需要的依赖包

RK3588是一款低功耗、高性能的处理器&#xff0c;适用于基于arm的PC和Edge计算设备、个人移动互联网设备等数字多媒体应用&#xff0c;RK3588支持8K视频编解码&#xff0c;内置GPU可以完全兼容OpenGLES 1.1、2.0和3.2。RK3588引入了新一代完全基于硬件的最大4800万像素ISP&…

sql-行转列3(转置)

行转列的常规做法是&#xff0c;group bysum(if())【或count(if())】 例题&#xff1a; 腾讯QQ 假设tableA如表5, tableB如表6, 表5 qq号&#xff08;字段名&#xff1a;qq&#xff09;游戏&#xff08;字段名&#xff1a;game&#xff09;10000a10000b10000c20000c20000d…

多个文件 import 的相同模块里的对象

多个文件 import 的相同模块里的对象&#xff0c;是否永远都是同一个对象&#xff1f; 在store的index.js中 import vue from ‘vue’ import Vuex from ‘vuex’ 并配置有关对象 然后再app.vue中配置vm 在不同的文件中 import一个vue对象&#xff0c;在任何情况下&#…

vue2项目升级到vue3经历分享5

写到第5篇了&#xff0c;解决了很多问题&#xff0c;还有一些需要调整 1 el-input-number指令兼容性调整 下面这个可编辑的表格&#xff0c;全是0&#xff0c;于是需要一个指令&#xff0c;让它自己实现如果是0&#xff0c;就置空&#xff1b;如果是数字就是格式化为千分位&…

局部Block及面试点

一、定义&#xff1a; 在 Objective-C 中&#xff0c;一个 block 是一种可以捕获周围上下文变量的匿名函数。当你想要定义一个只在当前作用域内使用的 block 时&#xff0c;你可以创建一个局部 block。以下是一个例子&#xff0c;展示如何用 Objective-C 写一个局部 block&…

[力扣题解]39. 组合总和

题目&#xff1a;39. 组合总和 思路 回溯法 代码&#xff0c;自己写的 // 自己写的 // 没有用 startindex 也可以实现&#xff01; class Solution { public: vector<vector<int>> result;vector<int> path;void function(vector<int>& candid…

使用docker安装seafile

使用docker安装seafile 1 介绍seafile Seafile 是一款开源的企业云盘&#xff0c;支持全平台&#xff08;浏览器、Windows、Mac、Linux、Android、IPhone等&#xff09;客户端。Seafile 内置协同文档 SeaDoc &#xff0c;让协作撰写、管理和发布文档更便捷。最重要的这是国产…

【网站项目】SpringBoot796水产养殖系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

【JavaEE初阶系列】——Cookie和Session应用之实现登录页面

目录 &#x1f6a9;本章目标 1.登录页面 2.servlet处理上述的登录请求 3.网站主页(成功登录之后的页面&#xff09; &#x1f6a9;实现过程 &#x1f393;登录页面 &#x1f393;Servlet处理登录请求 &#x1f388;获取请求传来的参数(用户名和密码) &#x1f388;验证…

一件事做了十年

目录 一、背景二、过程1.贫困山区的心理悲哀2.基础差的客观转变3.对于教育的思考4.持续做这件事在路上5.同行人有很早就完成的&#xff0c;有逐渐放弃的&#xff0c;你应该怎么办&#xff1f;6.回头看&#xff0c;什么才是最终留下的东西? 三、总结 一、背景 在哪里出生我们无…

《Linux运维总结:ARM64架构CPU基于docker-compose一离线部署rabbitmq 3.10.25容器版镜像模式集群》

总结&#xff1a;整理不易&#xff0c;如果对你有帮助&#xff0c;可否点赞关注一下&#xff1f; 更多详细内容请参考&#xff1a;《Linux运维篇&#xff1a;Linux系统运维指南》 一、部署背景 由于业务系统的特殊性&#xff0c;我们需要面向不通的客户安装我们的业务系统&…

c++题目_守望者的逃离

题目描述 恶魔猎手尤迫安野心勃勃.他背叛了暗夜精灵&#xff0c;率深藏在海底的那加企图叛变&#xff1a;守望者在与尤迪安的交锋中遭遇了围杀.被困在一个荒芜的大岛上。为了杀死守望者&#xff0c;尤迪安开始对这个荒岛施咒&#xff0c;这座岛很快就会沉下去&#xff0c;到那时…

外贸客户开发用什么软件做?

外贸客户开发可以使用多种软件来完成&#xff0c;以下是一些常用的软件推荐&#xff1a; 即时通讯软件&#xff1a; SKYPE&#xff1a;一款功能丰富的即时通讯软件&#xff0c;支持视频聊天、多人语音会议、文件传输等&#xff0c;方便与海外客户进行实时沟通。Line&#xff1…

【ubuntu】ubuntu-18.04开机卡在Starting User Manager for UID 120....问题解决方案

错误截图 解决方案 启动系统&#xff0c;开机界面单击按键esc键&#xff0c;注意需要将鼠标定位到菜单界面&#xff0c;移动键盘上下键选择Advanced options for Ubuntu 进入如下菜单&#xff0c;选择recovery mode 回车之后会弹出如下界面&#xff0c;选择如下root&#xff0…

超详细的胎教级Stable Diffusion使用教程(四)

这套课程分为五节课&#xff0c;会系统性的介绍sd的全部功能和实操案例&#xff0c;让你打下坚实牢靠的基础 一、为什么要学Stable Diffusion&#xff0c;它究竟有多强大&#xff1f; 二、三分钟教你装好Stable Diffusion 三、小白快速上手Stable Diffusion 四、Stable dif…

【C语言/Python】嵌入式常用数据滤波处理:卡尔曼滤波器的简易实现方式(Kalman Filter)

【C语言/Python】嵌入式常用数据滤波处理&#xff1a;卡尔曼滤波器的简易实现方式&#xff08;Kalman Filter&#xff09; 文章目录 卡尔曼滤波卡尔曼滤波公式卡尔曼滤波数据处理效果C语言的卡尔曼滤波实现附录&#xff1a;压缩字符串、大小端格式转换压缩字符串浮点数压缩Pack…

Spring-Cloud-OpenFeign源码解析-01-OpenFeign简介

OpenFeign简介 OpenFeign是一种声明式、模板化的HTTP客户端(仅在Application Client中使用)。声明式调用是指&#xff0c;就像调用本地方法一样调用远程方法&#xff0c;无需感知操作远程http请求。 OpenFeign和Feign的区别 Feign是Spring Cloud组件中一个轻量级RESTful的HT…