原理
插入排序是一种基于比较的排序算法,其基本思路是将数组分成已排序和未排序两个部分。算法通过逐步将未排序部分的元素插入到已排序部分的合适位置,从而实现整个数组的排序。
工作步骤
1、初始化:
- 从数组的第二个元素开始(下标为1),因为第一个元素(下标为0)可视为是一个只有一个元素的已排序部分。
2、迭代未排序部分:
- 对于每个元素(称为
key
),在已排序部分中寻找其正确位置。 - 使用一个索引(
j
)来跟踪已排序部分的元素。
3、比较与移动:
- 从已排序部分的最后一个元素开始(即
array[j]
),判断其是否大于key
: - 如果是,则将
array[j]
移动到array[j+1]
位置,继续向左比较。 - 如果不是,则找到
key
的合适插入位置(即j + 1
)。
4、插入元素:
- 当找到合适位置后,将
key
插入到该位置。
5、重复:
- 重复步骤2到步骤4,直到整个数组被处理完。
代码
using System;
class Program
{
static void InsertionSort(int[] array)
{
for (int i = 1; i < array.Length; i++)
{
int key = array[i];
int j = i - 1;
// 将 key 插入已排序的部分
while (j >= 0 && array[j] > key)
{
array[j + 1] = array[j];
j--;
}
array[j + 1] = key;
}
}
static void Main(string[] args)
{
// 示例数组
int[] arr = { 5, 2, 4, 6, 1, 3 };
Console.WriteLine("原始数组: " + string.Join(", ", arr));
InsertionSort(arr);
Console.WriteLine("排序后的数组: " + string.Join(", ", arr));
}
}
例子
假设我们要对数组 [5, 2, 4, 6, 1, 3]
进行插入排序,下面是每一步的详细过程:
-
初始状态:
[5, 2, 4, 6, 1, 3] ↑ 已排序部分
-
第1步(i=1,key=2):
2
<5
,将5
向右移动。
[5, 5, 4, 6, 1, 3] ↑ 合适位置
- 将
2
插入:
[2, 5, 4, 6, 1, 3] ↑ 已排序部分
-
第2步(i=2,key=4):
4
<5
,将5
向右移动。
[2, 5, 5, 6, 1, 3] ↑ 合适位置
- 将
4
插入:
[2, 4, 5, 6, 1, 3] ↑ 已排序部分
-
第3步(i=3,key=6):
6
大于5
,直接插入:
[2, 4, 5, 6, 1, 3] ↑ 已排序部分
-
第4步(i=4,key=1):
1
<6
,5
,4
,2
,逐一向右移动:
[2, 4, 5, 6, 6, 3] [2, 4, 5, 5, 6, 3] [2, 4, 4, 5, 6, 3] [2, 2, 4, 5, 6, 3]
- 将
1
插入:
[1, 2, 4, 5, 6, 3]
-
第5步(i=5,key=3):
3
<6
,5
,4
,逐一向右移动:
[1, 2, 4, 5, 6, 6] [1, 2, 4, 5, 5, 6] [1, 2, 4, 4, 5, 6]
- 将
3
插入:
[1, 2, 3, 4, 5, 6]
完成
经过这些步骤,最终数组就被成功排序为 [1, 2, 3, 4, 5, 6]
。
总结
插入排序直观简单,适合于小规模数据的排序,尤其在数据接近有序时性能极好。尽管在大规模数据集上的效率较低,但由于其简单性和原地排序的特点,在一些场景中依然广泛使用。
更多学习内容,可关注公众号:CAD软件二次开发
以上内容为个人测试过程的记录,供大家参考。
内容如有错欢迎批评指正,谢谢!!!!