C语言--直接插入排序【排序算法|图文详解】


一.直接插入排序介绍🍗

直接插入排序又叫简单插入排序,是一种简单直观的排序算法,它通过构建有序序列,对于未排序的数据,在已排序序列中从后向前扫描,找到相应位置并插入。

算法描述:

  1. 假设要排序的列表为arr,列表的第一个元素arr[0]默认已经是有序序列。
  2. 从第二个元素开始,即arr[1],向前遍历已排序的部分,将该元素插入到正确的位置。
  3. 在遍历已排序部分时,如果当前元素小于前一个元素,将当前元素与前一个元素交换位置,否则停止遍历。
  4. 重复步骤2和步骤3,直到所有元素都被插入到正确的位置。

由于在每次插入过程中,需要不断比较和移动元素,最坏情况下时间复杂度为O(n^2),其中n是要排序的元素个数。然而,若输入数据已经近乎有序,直接插入排序的效率会比较高,时间复杂度可接近O(n)。若完全有序,时间复杂度为O(n).

直接插入排序的特点:

不需要额外的空间

过程稳定

适用于数据规模较小且部分有序的情况


二.图解过程🍗

以下以数组6,3,4,5,7,1为例。从小到大排序
核心:取出无序部分的首个,在有序部分从后向前比较,插入到合适的位置

1. 首先看第一个数字:6,把数组分为有序部分和无序部分。

2.把无序部分的第一个元素3,插入到有序部分的合适位置

 

3.重复2中的操作部分,直到所有元素都有序。

需要注意的是有时候需要多次比较,比如数字1,需要多次比较,一次插入。

 

 最后重复以上步骤,直至完全有序。


 三.代码分析🍗

  • 由于第一个数字是有序的,因此n个数字只需要遍历n-1次,i的初始值设为1
  • 由于每次插入时都是从前一个数字开始比较,我们可以设置j的初始值为i-1
  • 完整代码
//直接插入排序(简单插入排序或者直接插入排序)
//第一个数字必然有序,所以从第二个数字开始的。
//从第二个数字开始, 从后往前找比当前数字小的, 找到后插入到这个小的数字的后面; 
//在找的过程中, 如果发现一个比当前数字大, 同时将这个数字往后挪.
#include <stdio.h>
void  InsertSort(int* arr, int len)//insert 插入
{int tmp;int j;for (int i = 1; i < len; i++)//i为当前需要处理的数字的下标,i从第二个数字下标1开始{tmp = arr[i];for (j = i - 1; j >= 0; j--)//从后往前找位置,同时移动数据{if (arr[j] > tmp){arr[j + 1] = arr[j];}else{//arr[j + 1] = tmp;break;}}arr[j + 1] = tmp;}
}
void  Show(int* arr, int len)
{for (int i = 0; i < len; i++){printf("%d  ", arr[i]);}printf("\n");
}
int main()
{int arr[] = { 6,3,4,5,7,1};InsertSort(arr, sizeof(arr) / sizeof(arr[0]));Show(arr, sizeof(arr) / sizeof(arr[0]));return 0;
}

运行结果


四.效率分析🍗

时间复杂度:
最坏情况下:时间复杂度为O(n^2)
完全有序情况下:时间复杂度为O(n)
空间复杂度:O(1)

创作不易,如果喜欢的话,请给博主一个免费的赞以表支持吧.🍗

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

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

相关文章

Unity VR Pico apk安装失败:INSTALL_FAILED_UPDATE_INCOMPATIBLE

我的报错&#xff1a; PICO4企业版。安装apk&#xff0c;报错“安装失败。&#xff08;所属的Unity项目打包的apk&#xff0c;被我在同一台pico4安装了20次&#xff09; 调试方法&#xff1a; PIco4发布使用UNITY开发的Vr应用&#xff0c;格式为apk&#xff0c;安装的时候发生…

龙芯杯个人赛串口——做一个 UART串口——RS-232

文章目录 Async transmitterAsync receiver1. RS-232 串行接口的工作原理DB-9 connectorAsynchronous communicationHow fast can we send data? 2.波特率时钟生成器Parameterized FPGA baud generator 3.RS-232 transmitter数据序列化完整代码&#xff1a; 4.RS-232 receiver…

Linux之vim编辑器

目录 vim编辑器 vim编辑器指令 命令模式指令 光标相关 移动光标相关 文本操作 底行模式指令 插入模式 vim配置 vimforcpp 面试官&#xff1a;小伙子&#xff0c;你是用什么环境编写代码的&#xff1f; 小明&#xff1a;vs2019 面试官&#xff1a;小伙子&#xff0c…

基于AT89C51单片机的8位密码锁仿真与实物制作

点击链接获取Keil源码与Project Backups仿真图&#xff1a; https://download.csdn.net/download/qq_64505944/88657969?spm1001.2014.3001.5503 源码获取 C 源码仿真图毕业设计实物制作步骤01 摘要 在日常的生活和工作中, 住宅与部门的安全防范、单位的文件档案、财务报表…

web前端html笔记2

新增状态标签<meter><progress> <meter> 属性 值 描述 high 数值 规定高值 low 数值 规定低值 max 数值 规定最大值 min 数值 规定最小值 optimum 数值 规定最优值 value 数值 规定当前值 <body> <meter high"50" …

【Qt之Quick模块】5. QML基本类型及示例用法

QML格式 以下是一个QML文件 import QtQuick 2.12Window {id: mainWindowwidth: 400height: 300visible: truetitle: "My QML Application"Rectangle {id: rectwidth: 200height: 100color: "red"Text {id: textItemtext: "Hello World!"font.p…

ueditor富文本编辑器中图片上传地址配置以及抓取远程图片地址的配置

一&#xff1a;图片上传保存地址配置 打开文件ueditor.php,找到imagePathFormat进行修改即可 一&#xff1a;远程抓取图片配置 打开文件ueditor.config.js,找到catchRemoteImageEnable&#xff0c;取消注释即可

python dash 写一个登陆页 4

界面 代码&#xff1a; 这里引入了dash_bootstrap_components 进行界面美化 &#xff0c;要记一些className&#xff0c;也不是原来说的不用写CSS了。 from dash import Dash, html, dcc, callback, Output, Input, State import dash_bootstrap_components as dbc app Dash…

[Linux] MySQL数据表(数据结构)管理

一、数据库 1.1 数据库的基本概念 数据库&#xff08;database&#xff09;是用来组织、存储和管理数据的仓库 数据库管理系统&#xff08;DBMS&#xff09;&#xff1a;是实现对数据有效组织&#xff0c;管理和存取的系统软件。 数据的建立和维护功能&#xff0c;数据定义…

STM32实战之深入理解I²C通信协议

目录 IC的物理层 IC的协议层 IC特点 IC 总线时序图 软件模拟IC时序分享 例程简介 例程分享 STM32的IC外设 IIC&#xff08;Inter-Integrated Circuit&#xff09;&#xff0c;也称为IC或TWI&#xff08;Two-Wire Interface&#xff09;&#xff0c;是一种广泛使用的串行…

Apache Flink 进阶教程(六):Flink 作业执行深度解析

目录 前言 Flink 四层转化流程 Program 到 StreamGraph 的转化 StreamGraph 到 JobGraph 的转化 为什么要为每个 operator 生成 hash 值&#xff1f; 每个 operator 是怎样生成 hash 值的&#xff1f; JobGraph 到 ExexcutionGraph 以及物理执行计划 Flink Job 执行流程…

什么是EMC工程师?

摘要: 今天来介绍一下什么是EMC工程师。一 EMC工程师起源要了解什么是EMC工程师&#xff0c;我们首先要了解什么是EMC。 今天来介绍一下什么是EMC工程师。 一 EMC工程师起源 要了解什么是EMC工程师&#xff0c;我们首先要了解什么是EMC。 工程师这个职业相信大家都耳熟能详…

Maven之插件入门

官方文档&#xff1a;https://maven.apache.org/guides/plugin/guide-java-plugin-development.html 命名规范 <yourplugin>-maven-plugin 创建项目 生成项目 方式一、IDEA 2023 方式二、命令行 mvn archetype:generate -DgroupIdcn.lsj -DartifactIdhello-maven-pl…

接口测试学习笔记

文章目录 认识urlhttp协议接口规范Postman实现接口测试设计接口测试用例使用软件发送请求并查看响应结果Postman 自动关联Postman如何提交multipart/form-data请求数据Postman如何提交查询参数Postman 如何批量执行用例单接口测试Postman 断言Postman参数化 接口测试自动化requ…

RabbitMQ入门指南(九):消费者可靠性

专栏导航 RabbitMQ入门指南 从零开始了解大数据 目录 专栏导航 前言 一、消费者确认机制 二、失败重试机制 三、失败处理策略 四、业务幂等性 1.通过唯一标识符保证操作的幂等性 2.通过业务判断保证操作的幂等性 总结 前言 RabbitMQ是一个高效、可靠的开源消息队列系…

TikTok地理标签:通过短视频游走全球景点

TikTok&#xff0c;这个全球短视频平台&#xff0c;不仅是创意的播放场所&#xff0c;更是连接全球用户的数字旅行通道。通过TikTok的地理标签&#xff0c;用户可以在短视频中游走于世界各地的景点&#xff0c;感受异国风情&#xff0c;分享旅行心情。本文将深入探讨TikTok地理…

7.3 uvm_config_db in UVM

uvm_config_db类派生自uvm_resource_db类。它是uvm_resource_db顶部的另一层便利层&#xff0c;简化了用于uvm_component实例的基本接口&#xff08;资源库的访问方法&#xff09;。 下面uvm_config_db类的代码段取自uvm源代码。 class uvm_config_db#(type Tint) extends uv…

【GitHub精选项目】短信系统测试工具:SMSBoom 操作指南

前言 本文为大家带来的是 OpenEthan 开发的 SMSBoom 项目 —— 一种用于短信服务测试的工具。这个工具能够发送大量短信&#xff0c;通常用于测试短信服务的稳定性和处理能力。在合法和道德的范畴内&#xff0c;SMSBoom 可以作为一种有效的测试工具&#xff0c;帮助开发者和系统…

【编译原理】基于词法分析器的LL1语法分析器

【编译原理】基于词法分析器的LL1语法分析器 实验要求 设计一个满足以下要求的⽂法&#xff1a; &#xff08;1&#xff09;识别只包含变量声明语句和执行语句程序段的语法结构合法性&#xff1b; &#xff08;2&#xff09;变量声明中只使用int,char,float 3类基本类型&…

Android studio 花式按键

一、activity_main.xml代码&#xff1a; <?xml version"1.0" encoding"utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:app"http://schemas.a…