一、基本原理
以排降序为例,对于一个下标为[0,n]的arr数组,从下标i=1开始,用tmp保存arr[i]的值,依次与i的前一位比较,若tmp<(或<=)arr[i-1],则arr[i]=arr[i-1];若tmp>=(或>)arr[i-1],就跳出本次排序,执行i++,经过(n-1)轮即可对数组完成排序。
插入排序实际上是,将一个新元素插入到已经排序好的原序列中,得到一个新的序列的过程。
图画理解:
二、代码展示
void InsertSort(int* arr, int sz)
{
for (int i = 1; i < sz; i++)
{
int tmp = arr[i];//创建tmp变量保存arr[i]
int end = i - 1;//创建end标志i-1的位置
while (end >= 0)//当end走到0之前时,跳出循环
{
if (arr[end] > tmp)//end所指向的元素比tmp大时
{
arr[end + 1] = arr[end];//将end的值赋給arr[end+1]
}
else//end所指向的元素比tmp大时
{
break;
}
end--;
}
arr[end + 1] = tmp;//把tmp的值赋给arr[end+1]
}
}
int main()
{
int arr[] = {2,4,1,3,5};
int sz = sizeof(arr) / sizeof(arr[0]);
InsertSort(arr, sz);
for (int i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
}
三、特性总结
1.元素集合约有序,效率越高(因为不必进行交换)。
2.时间复杂度O(N^2)(最坏的情况是倒序的情况,此时比较次数为1+2+3+...+(n-1)等差数列,近似为N^2)。
3.空间复杂度O(1)。
3.稳定性:稳定。
四、小结
本人是c语言萌新一枚,希望能与大家多多交流,共同进步,如果对文章中的内容有什么错误,欢迎私信或在评论区中指正,谢谢大家。