当前位置: 首页 > news >正文

排序算法入门:直接插入排序详解

这里写目录标题

  • 介绍
  • 原理
  • 代码实现
  • 分析

介绍

直接插入排序是一种简单直观的排序算法,适用于小规模数据或基本有序的数据集。其核心思想是构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。

原理

我们以下面这组数据为例
在这里插入图片描述
在开始排序前我们先了解直接插入排序的精髓

我们在打扑克时,习惯将手牌排成有序状态。当我要为J排序时,我习惯把J拿出来,此时J的位置相当于空出来了,如果J的前面是K,那我把J插入到K的前面。这个过程相当于让K后移到J起初的位置,再把J插入到空缺位置。

所以,直接插入排序的精髓在我看来就是腾出一个空位置

有了这个认识我们现在来尝试给数据排序:

–我定义出 i指针 和 j指针,i指针向后移动,j指针始终在 i指针的前一个位置
在这里插入图片描述
–利用"空位置"思想,把44取出,由变量tmp保存其数值。此时就相当于出现一个空位
在这里插入图片描述
–比较 j 和 j+1(其实就是i),如果 j>j+1,就将 j挪到 j+1的位置。随后数据会被分为有序区和无序区
在这里插入图片描述
–上面那个例子不能体现移动的过程,来看下面这个
在这里插入图片描述
tmp < 44,此时应该让44后移
在这里插入图片描述
44移动后,“空缺”相当于出现在原本是44的位置。在移动的过程中,我们不去改变 i的值,所有控制都通过 j实现,j需要跟着往前移动,直到 j走出数组。

–我们再来看一次移动,后续逻辑都是相似的
在这里插入图片描述
我们插入5时,排序的过程如下图所示
在这里插入图片描述

–总结这个过程:
将待排序数据分为已排序和未排序两部分。初始时已排序部分仅包含第一个元素,未排序部分包含剩余元素。从未排序部分取出第一个元素,与已排序部分的元素从后向前依次比较,找到合适的位置插入。

代码实现

void insertionSort(int arr[], int n)
{if (n <= 1) return; // 处理空数组或只有一个元素的情况int i, j;for (i = 1; i < n; i++){if (arr[i] < arr[i - 1]){int tmp = arr[i];for (j = i - 1; j >= 0 && tmp < arr[j]; j--){arr[j + 1] = arr[j];}arr[j + 1] = tmp;}}
}

分析

最好情况:数组已经是有序的,时间复杂度为O(N),仅需遍历一次
最坏情况:数组完全逆序,时间复杂度O(N^2),i和j都要遍历

http://www.dtcms.com/a/306291.html

相关文章:

  • 应用宝(MediaRouteProviderService)媒体路由保活思路研究
  • 从 “内容篮子” 到 “生态平台”:融媒体 App 靠什么打破服务边界?
  • 在 Mac 上用 Vagrant 安装 K8s
  • JavaScript语法、关键字和变量
  • 提高建筑舒适度与能源效率,楼宇自控系统意义重大
  • 极致业务弹性 密度性能双管齐下—联想问天 WR5220 G5 服务器测试
  • 将 qt 构建为静态库
  • 2025年电子设计大赛G题《电路模型探究装置》各小问数学推导及个人思路
  • 信贷风控笔记8-解读商业银行资本管理办法笔记
  • 检索排序(Re-ranking):搜索与推荐系统的精细化利器
  • MySQL 中的 Binlog 及其在删除数据库时的作用:点时间恢复(PITR)
  • Python .toml 安装文件介绍
  • 使用git提交时出现了报错,新手不会的可以参考一下。
  • 技术复盘报告:Vue表格中多行文本字段数据保存丢失问题
  • 深入浅出设计模式——创建型模式之单例模式 Singleton
  • Docker离线安装依赖包地址
  • USRP捕获手机/路由器数据传输信号波形
  • Windows环境下安装Python和PyCharm
  • 【ip】IP地址能否直接填写255?
  • 【maven】仓库配置
  • 02 基于sklearn的机械学习-特征降维(特征选择、PCA)、KNN算法、模型选择与调优(交叉验证、朴素贝叶斯算法、拉普拉斯平滑)
  • 2507C++,介绍名字对象
  • Apache Ignite 集群状态(Cluster States)
  • fortigate的waf功能
  • openwrt中br-lan,eth0,eth0.1,eth0.2
  • day08(if-esle)
  • Linux 软件包管理
  • 【机器学习】机器学习新手入门概述
  • 基于C++的智能交通和智能公交流量预测与调度优化
  • 【物联网】基于树莓派的物联网开发【18】——树莓派安装Mosquitto服务