1.插入排序的基本原理
871542639
两个区域
排序区 未排序区
用一个索引值做分水岭
未排序区元素
与排序区元素比较
插入到合适位置
直到未排序区清空
int[] arr = { 8, 6, 7, 2, 9, 4 };
//第一步
//能取出未排序区的所有元素进行比较
//i=1的原因:默认第一个元素就在排序区
for (int i = 1; i < arr.Length; i++)
{
//第二步
//每一轮
//1.取出排序区的最后一个元素索引
int sortIndex = i - 1;
//2.取出未排序区的第一个元素
int noSortNum = arr[i];
//第三步
//在未排序区进行比较
//移动位置
//确定插入索引
//循环停止条件:
//1.发现排序区所有元素比较完
//2.发现排序区元素不满足条件
while (sortIndex >= 0 && arr[sortIndex]>noSortNum)
{
//只要进了循环,证明满足条件
//排序区元素需要往后退一格
arr[sortIndex + 1] = arr[sortIndex];
//移动到排序区前一个位置继续比较
--sortIndex;
}
//最终插入数字
//循环只是确认位置,循环结束后最终插入对应位置
arr[sortIndex + 1] = noSortNum;
}
总结:
为什么有两层循环
第一层循环:一次取出未排序区的元素进行排序
第二层循环:找到想要插入的位置
为什么第一层循环从1开始遍历
插入排序的关键是分两个区域
已排序区和未排序区
默认第一个元素在已排序区
为什么使用while循环
满足条件才比较
否则证明插入位置已确定
不需要继续循环
为什么可以直接往后移位置
每轮未排序数已记录
最后一个位置不怕丢
为什么确定位置后,是放在sort Index+1的位置
当循环停止时,插入位置应该是停止循环的索引1处
基本原理
两个区域
用索引值来区分
未排序区与排序区
元素不停比较
找到合适位置
插入当前元素
套路写法
两层循环
一层获取未排序区元素
一层找到合适插入位置
注意事项
默认开头已排序
第二层循环外插入