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

排序算法:详解插入排序

快速排序介绍

插入排序是一种简单直观的排序算法,它的工作原理类似于我们整理扑克牌,将每个新元素插入到已排序部分的正确位置。

快速排序原理

一、核心思想

1. 将数组分为两部分

  • 已排序部分(初始时只有第一个元素)
  • 未排序部分(剩余的所有元素)

2. 逐个处理未排序元素

  • 从未排序部分取出一个元素
  • 在已排序部分中找到合适的位置插入
  • 重复直到所有元素都排序完成

二、工作原理图

让我们用数组
[5, 2, 4, 6, 1, 3]
来演示插入排序的过程:

初始: [5, 2, 4, 6, 1, 3]↑ (已排序部分只有5)第1轮: 取出2,与5比较 → 2 < 5,5后移,2插入 → [2, 5, 4, 6, 1, 3]
第2轮: 取出4,与5比较 → 4 < 5,5后移;与2比较 → 4 > 2,插入 → [2, 4, 5, 6, 1, 3]
第3轮: 取出6,与5比较 → 6 > 5,直接插入 → [2, 4, 5, 6, 1, 3]
第4轮: 取出1,依次比较并移动6,5,4,2,1插入开头 → [1, 2, 4, 5, 6, 3]
第5轮: 取出3,依次比较并移动6,5,4,3插入 → [1, 2, 3, 4, 5, 6]

算法特点

特点说明
稳定性稳定,相等元素相对位置不变
空间复杂度O(1),原地排序
时间复杂度(最好)O(n),数组已有序时
时间复杂度(平均)O(n²),一般情况
时间复杂度(最坏)O(n²)数组完全逆序
适用场景小规模数据、基本有序数据,实际应用中适用于小数组

代码实现

一、基础版

public class InsertionSortBasic {/*** 插入排序基础实现* @param arr 待排序数组*/public static void insertionSort(int[] arr) {int n = arr.length;// 从第二个元素开始(索引1),因为第一个元素默认已排序for (int i = 1; i < n; i++) {System.out.println("第 " + i + " 轮,处理元素: " + arr[i]);// 当前要插入的元素int key = arr[i];// 从当前元素的前一个位置开始比较int j = i - 1;// 将比key大的元素向后移动while (j >= 0 && arr[j] > key) {System.out.println("  移动 " + arr[j] + " 到位置 " + (j + 1));arr[j + 1] = arr[j];  // 元素后移j--;  // 继续向前比较}// 将key插入到正确位置arr[j + 1] = key;System.out.println("  插入 " + key + " 到位置 " + (j + 1));System.out.println("  当前数组: " + java.util.Arrays.toString(arr));}}public static void main(String[] args) {int[] arr = {5, 2, 4, 6, 1, 3};System.out.println("原始数组: " + java.util.Arrays.toString(arr));System.out.println("开始插入排序:\n");insertionSort(arr);System.out.println("\n最终排序结果: " + java.util.Arrays.toString(arr));}
}

二、优化版本(减少赋值操作)

public class OptimizedInsertionSort {/*** 优化版插入排序 - 使用元素交换代替后移操作* 代码更简洁,但性能稍差(交换操作比赋值多)*/public static void insertionSortOptimized(int[] arr) {int n = arr.length;for (int i = 1; i < n; i++) {System.out.println("第 " + i + " 轮,处理元素: " + arr[i]);// 从当前位置向前比较并交换for (int j = i; j > 0 && arr[j] < arr[j - 1]; j--) {// 交换相邻元素swap(arr, j, j - 1);System.out.println("  交换 " + arr[j] + " 和 " + arr[j - 1] + " → " + java.util.Arrays.toString(arr));}}}/*** 交换数组中的两个元素*/private static void swap(int[] arr, int i, int j) {int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}public static void main(String[] args) {int[] arr = {5, 2, 4, 6, 1, 3};System.out.println("原始数组: " + java.util.Arrays.toString(arr));System.out.println("开始优化插入排序:\n");insertionSortOptimized(arr);System.out.println("\n最终排序结果: " + java.util.Arrays.toString(arr));}
}

插入排序虽然在大数据量下效率不高,但其简单性、稳定性和对小数据的高效性使其在实践中仍有重要地位!

架构设计之道在于在不同的场景采用合适的架构设计,架构设计没有完美,只有合适。
在代码的路上,我们一起砥砺前行。用代码改变世界!

  • 工作 3 年还在写 CRUD,无法突破技术瓶颈?
  • 想转技术管理但不会带团队?
  • 想跳槽没有面试的机会?
  • 不懂如何面试,迟迟拿不到 offer?
  • 面试屡屡碰壁,失败原因无人指导?
  • 在竞争激烈的大环境下,只有不断提升核心竞争力才能立于不败之地。

欢迎从事编程开发、技术招聘 HR 进群,欢迎大家分享自己公司的内推信息,相互帮助,一起进步!

—— 斩获心仪Offer,破解面试密码 ——
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

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

相关文章:

  • [MLflow] 部署OpenAI聊天网关 | 令牌桶算法限流 | 分布式追踪 | Trace Span
  • 【010】智能图书系统
  • LeetCode 刷题【124. 二叉树中的最大路径和】
  • linux 的文件结构
  • stack,queue,咕咕咕!
  • 做网站不实名认证可以吗佛山城市建设工程有限公司
  • 构建基于大语言模型的智能数据可视化分析工具的学习总结
  • Android 架构演进全解析:MVC、MVP、MVVM、MVI 图文详解
  • 网站后台免费模板下载艺术字体在线生成器转换器
  • HC32 操作GPIO点亮LED(HC库)
  • 如何用python来做小游戏
  • 捡到h3开发板,做了个视频小车(二),御游追风plus做遥控器
  • U盘安装群晖RR引导
  • 昆山市住房和城乡建设网站wordpress淘宝联盟
  • 数据库中表和视图的关系
  • 优先级队列的学习(二)
  • 内部排序——一文速通
  • 数据结构——东方财富掘金量化速成学习(python)
  • 做网站商城项目的流程深圳专业网站设计哪家好
  • 【招聘】-音视频行业企业的招聘分析
  • css word属性
  • 晋中网站seo芯火信息做网站怎么样
  • Orleans 流系统握手机制时序图
  • 【C + +】异常处理:深度解析与实战
  • 《从理论到实践:红黑树的自平衡机制与C++高效实现指南》
  • 将iOS/macOS应用上架至App Store
  • 海南做网站电话如今做哪个网站能致富
  • 数据结构——栈在递归中的应用
  • java.net 包详解
  • Three.js光照技术详解:为3D场景注入灵魂