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

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

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

  • 概述
  • 算法核心思想
  • 算法步骤详解
  • 代码实现
    • 代码细节
  • 分析
  • 总结

概述

在排序算法的大家庭中,直接插入排序是一种兼具直观性和实用性的基础算法。它的核心思想源于日常生活中整理数据的习惯 —— 就像我们玩扑克牌时,会把新摸到的牌按顺序插入到手中已排好的牌堆里,这种 “边插入边排序” 的逻辑正是直接插入排序的精髓。

算法核心思想

直接插入排序的核心逻辑可以概括为:将数组分为 “已排序区” 和 “未排序区”,每次从 “未排序区” 取第一个元素,插入到 “已排序区” 的合适位置,使 “已排序区” 始终保持有序。随着插入操作的重复,“已排序区” 从数组头部开始逐渐扩大,最终覆盖整个数组,完成排序。

算法步骤详解

在这里插入图片描述
我们以该数组为例

  1. 初始化数组
    数组的首个元素我们认为其为天然有序的,即其已经处于“已排序区”,其余元素均在“未排序区”在这里插入图片描述

  2. 取未排序元素
    遍历到新元素时,将其从数组中“取出”,作为待排元素在这里插入图片描述

  3. 寻找插入位置
    将待排元素与已排序区的元素做比较在这里插入图片描述

  4. 移动与插入
    将已排序区比待排元素大的元素向后移动,腾出位置在这里插入图片描述

  5. 重复操作
    重复2-4,直到数组有序。此处我再用一次排序举例帮助你理解,后续的排序你自己能够轻易完成。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

代码实现

void InsertionSort(int arr[], int n)
{for (int i = 1; i < n; i++){if (arr[i - 1] > arr[i]){int tmp = arr[i];int j = i - 1;while (arr[j] > tmp && j >= 0){arr[j + 1] = arr[j];j--;}arr[j + 1] = tmp;}}
}

代码细节

while (arr[j] > tmp && j >= 0)
// 而不是while (arr[j] > arr[j+1] && j >= 0)

我直接说如果是后者会发生什么
在插入25时,如果是arr[j] > arr[j+1],会导致元素移动提前结束在这里插入图片描述
对比在这里插入图片描述
这个问题聪明如你不一定能遇到,我写出来是因为我犯蠢写出来了,记录下来警示自己。

arr[j + 1] = tmp;
// 是arr[j + 1]而不是arr[j]

这个问题我也遇到过,上面的例图中我没有加上j,下面我以第一次插入为例,看一遍你就能理解在这里插入图片描述
在这里插入图片描述
加上循环就很很好理解吧

分析

最坏情况:完全逆序,时间复杂度O(n^2)
最优情况:已经有序,时间复杂度O(n)

优点:

  • 实现简单
  • 稳定性好
  • 高效处理接近有序数据

缺点:

  • 不适合大规模数据

总结

直接插入排序以其简单直观的逻辑和对接近有序数据的高效处理,成为排序算法中的基础经典算法。虽然它在大规模数据排序中表现不佳,但在小规模场景或作为优化手段时依然具有重要价值,是理解 “插入式” 排序思想的最佳入门案例。

http://www.lryc.cn/news/609564.html

相关文章:

  • 室内分布系统
  • ICCV 2025|单视频生成动态4D场景!中科大微软突破4D生成瓶颈,动画效果炸裂来袭!
  • Flutter开发 了解Scaffold
  • 深入理解Java的SPI机制,使用auto-service库优化SPI
  • 区块链基础之Merkle B+树
  • Azure DevOps - 使用 Ansible 轻松配置 Azure DevOps 代理 - 第6部分
  • 打造个人数字图书馆:LeaNote+cpolar如何成为你的私有化知识中枢?
  • 多级表头的导出
  • 软件打包前进行文件去重
  • Unix 命令行shell基础--学习系列003
  • Web 开发 12
  • 嵌入式硬件中三极管原理分析与控制详解
  • 嵌入式硬件篇---OpenMV存储
  • 单片机51 day46
  • 基于单片机智能鱼缸/水族箱/水产养殖系统设计
  • 第二篇:深入解析 FastAPI + LangChain 实现流式对话接口:`chat` 函数详解
  • 嵌入式硬件中三极管推挽电路控制与实现
  • 单片机裸机程序设计架构
  • Ubuntu 下 MySQL 运维自动化部署教程(在线简易版)
  • MLIR Introduction
  • cobalt strike(CS)与Metasploit(MSF)联动
  • Nestjs框架: @nestjs/config 配置模块详解与实践
  • Go 语言模糊测试 (Fuzz Testing) 深度解析与实践
  • 基于鼠标位置的相机缩放和平移命令的实现(原理+源码)
  • Java 17新特性深度解读:Records、Sealed Classes与Pattern Matching
  • 宝塔面板安装WordPress教程:10分钟一键部署搭建个人博客 (2025)
  • Git如何同步本地与远程仓库并解决冲突
  • Linux 用户与组管理全解析
  • 电商系统想撑住大流量?ZKmall开源商城靠微服务 + Spring Boot3 解决单体架构难题
  • JavaScript中的作用域、闭包、定时器 由浅入深