基本概念
插入排序法是将数组中的元素逐一与已排序好的数据进行比较,先将前两个元素拍好,再将第三个元素插入适当地位置,也就是说这三个元素莹然是已排序好的,接着将第四个元素加入,重复此步骤,直到排序完成为止。
执行逻辑如下:
- 首先,假设我们有一个待排序的列表或数组,将其分为已排序部分和未排序部分。
- 初始化时,将第一个元素视为已排序的部分,其余的元素都属于未排序的部分。
- 从第二个元素开始,依次将未排序部分的元素插入到已排序部分的合适位置。
- 对于每个未排序的元素,将其与已排序的部分从右到左逐个比较,直到找到合适的位置。
- 比较时,将当前元素与已排序部分的元素逐个比较,并将比当前元素大的元素向右移动一个位置,为当前元素腾出插入的位置。
- 重复步骤 4 和步骤 5,直到未排序部分的所有元素都插入到已排序部分中。
- 最后,已排序部分即为排序完成的列表或数组。
代码示例
void InsertSort(int[] arr)
{
for (int i = 0; i < arr.Length; i++)
{
int tmp = arr[i];
int j = i - 1;
//如果第二个元素小于第一个元素,就把所有元素往后推一个位置
while (j >= 0 && tmp < arr[j])
{
arr[j + 1] = arr[j];
j--;
}
//最小的元素放到第一个位置
arr[j+1] = tmp;
}
}
//测试代码
void TestFunc()
{
int[] arr = { 23, 34, 67, 87, 211, 656, 0, 1 };
InsertSort(arr);
for (int i = 0; i < arr.Length; i++)
{
Console.WriteLine(arr[i]);
}
}
插入排序法的分析
1.最坏情况和最平均情况需要n(n-1)/2次,时间复杂度为O(n^2);最好情况的时间复杂度为O(n)。
2.插入排序是稳定排序法
3.因为只需要一个额外空间,所以空间复杂度为最佳
4.此排序法适用于大部分数据已经排序或已排序数据库新增数据后进行排序的情况。
5.因为插入排序法会造成数据的大量搬移,所以建议在链表上使用。