一、插入排序的原理
将需要排序的数组划分为未排序部分和排序部分,在两个部分中间增加一个索引值用来作为分隔。未排序部分不断地与已排序好的部分的元素进行比较,插入到合适的位置,直到未排序的元素为空,停止排序。注意:这两部分处于同一个数组中。
插入排序图像展示
二、代码实现部分
//实现升序 大的放在后面 降序就把>改为<
int[] arr = { 8, 7, 1, 5, 4, 2, 6, 3, 9 };
//前提规则 排序开始前
//首先认为第一个元素在排序区
//其余元素在未排序区
//排序开始后
//每次将未排序区第一个元素取出用于和
//排序区元素比较 从后往前
//满足条件 较大或较小
//则排序区中的元素往后移动一个位置
//注意 所有数字都在同一个数组中
//所谓的两个域是一个分水岭索引
//第一步
//能取出未排序区的所有元素进行比较
//i= 1的原因:默认第一个元素就在排序区
for (int i = 1; i < arr.Length; i++)
{
//第二步
//每一轮
//1.取出排序区的最后一个元素索引
int sortIndex = i - 1;
//2.取出未排序区的第一个元素
int unSortValue = arr[i];
//第三步
//在未排序区进行比较
//移动位置
//确定插入索引
//循环停止条件
//1.发现前面排序区的元素已经比较完毕
//2.发现前面排序区的元素已经不满足比较条件了
while (sortIndex>=0 && arr[sortIndex] > unSortValue)
{
//只要进了这个while循环 证明满足条件
//排序区中的元素 就应该往后退一个位置
arr[sortIndex + 1] = arr[sortIndex];
//移动到排序区的前一个位置 准备继续比较
--sortIndex;
}
//最终插入数字
//循环中只是在确定位置
//最终插入对应位置 应该在循环结束后
arr[sortIndex + 1] = unSortValue;
}
for (int i = 0; i < arr.Length; i++)
{
Console.WriteLine(arr[i]);
}
三、总结
//为什么有两层循环
//第一层循环:一次取出未排序区的元素进行排序
//第二层循环:在排序区中找到合适的位置
//为什么第一层循环从1开始遍历
//插入排序的关键是分两个区域
//已排序区 和 未排序区
//默认第一个元素在已排序区
//为什么使用while循环
//满足条件才比较
//否则证明插入位置已确定
//不需要继续循环