目录
一、直接插入排序的定义
直接插入排序是一种简单直观的排序算法,其基本思想是将一个元素插入到已经排好序的部分数组中,使得插入后的数组仍然保持有序。具体实现时,从第二个元素开始依次将元素插入到已排序部分的合适位置,直到所有元素都被插入完成,从而达到排序的目的。
简而言之,每一趟从待排序序列中取第一个值,将其插入到已排序好的序列,对已排序好的序列,从右向左依次和待插入值比较,如果大于则向后挪动,如果发现了一个小于等于插入值的值,或者触底,则插入到其后。
二、直接插入排序的原理
直接插入排序是一种简单直观的排序算法,其原理如下:
-
将数组分为已排序区间和未排序区间。初始时,已排序区间只包含数组的第一个元素,未排序区间包含剩余的元素。
-
从未排序区间中选择第一个元素,将其插入到已排序区间的合适位置,使得已排序区间仍然保持有序。
-
重复上述步骤,逐个将未排序区间中的元素插入到已排序区间中,直到未排序区间中的所有元素都被插入到已排序区间中。
-
最终得到一个完全有序的数组。
直接插入排序的时间复杂度为 O(n^2),是一种稳定的排序算法。它适用于小规模数据或者基本有序的数据。

三、直接插入排序的特点
直接插入排序的特点:
1.时间复杂度和数据的杂乱程度有关系,数据越有序,时间复杂度越低。
2.数据量越小,花费的时间不会太大。
时间复杂度O(n^2) 空间复杂度O(1) 稳定性:稳定
四、代码实现
cpp
void Insert_Sort(int arr[], int len)
{
//for (int i = 0; i < len - 1; i++)//控制趟数
int i, j;
for (i = 1; i < len; i++)
{
int tmp = arr[i];//i下标的值就是我们这一趟准备插入的值
for (j = i - 1; j >= 0; j--)//j下标一开始保存已排序好的序列的最右端值的下标,逐步向左走
{
if (arr[j] > tmp)
{
arr[j + 1] = arr[j];
}
else
{
//插入情况1: 找到了一个 <= 准备插入的值
break;
}
}
//如果代码执行到这,代表着触底。
//插入情况2:已排序好的序列中的值都比tmp的值大
arr[j + 1] = tmp;
}
}
void Show(int arr[], int len)
{
for (int i = 0; i < len; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
}
测试用例代码:
cpp
int main()
{
int arr[] = { 2,4,3,1,6,5,7,9,10,8 };
int len = sizeof(arr) / sizeof(int);
Insert_Sort(arr, len);
Show(arr, len);
return 0;
}
运行结果:
