插入排序
插入排序

要把7放入:首先我前面的已经排好序了,拿到一个新的7。
先与10比,比十小肯定插在十的前面。再和5比,比5大肯定插在5的后面。
从小到大,遇到比我大的就往前走,直到遇到比我小的我就在这个后面。"欺小怕大"
代码:
private static void insertSort(int[] arr) {
// TODO Auto-generated method stub
//开始摸牌,从上到小一张一张的去摸
for (int i = 0; i < arr.length; i++) {
// 这张牌的点数是arr[i];
// 手上的牌0~i-1
int lastIndex = i -1;//原有手牌最后一张的位置
int v = arr[i]; //新手牌,因为往后挪动会覆盖掉原有的值
while(lastIndex>=0&&v<arr[lastIndex]) {
arr[lastIndex+1] = arr[lastIndex];
lastIndex--;//比完之后最末的一张要往前挪
}
//lastIndex ==-1 或者新手牌更大了
//新手牌插入
arr[lastIndex+1] = v;
}
}
总结:
1.Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1
while(v<arr[lastIndex]) {
arr[lastIndex+1] = arr[lastIndex];
lastIndex--;//比完之后最末的一张要往前挪
}
因为我们有一次会很不幸的把这个lastIndex赋值为-1,比如下面当比到第一项2的时候,此时lastIndex = 0,然而计算机并不知道前面没有了,所以lastIndex - 1 = -1。
添加约束条件lastIndex>=0
2.检验每个语句中是否下标越界
int v = arr[i]; //新手牌,因为往后挪动会覆盖掉原有的值
这里i的范围是0~length-1,不会越界。
int lastIndex = i -1;//原有手牌最后一张的位置
lastIndex不停在减少,要限制它大于等于0。
//最后一个手牌的位置+1才是新手牌插入的位置
arr[lastIndex+1] = v;
进入这一句话说明lastIndex ==-1 或者新手牌更大了。因为while循环(while(lastIndex>=0&&v<arr[lastIndex]))之后说明已经不满足前面的那个大于新插入的这个。将其插入到不满足的后边那个即可
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律