每天学习一个基础算法之插入排序
目录
前言:
一、插入排序的基本思路与实现方法
1、基本思路
2、实现方法
二、插入排序的执行过程示意图
三、插入排序的实现代码
插入排序代码主体(以接口函数的形式)
测试部分(主函数调用)
四、对插入排序复杂度的分析
背景知识:
1、插入排序的时间复杂度
2、插入排序的空间复杂度
总结:
前言:
本文从概念理解、思路分析、画图举例,代码实现、复杂度分析等多个方面对插入排序进行详细的讲解,包含插入排序的基本思路与实现方法、执行过程示意图、代码,以及对时间和空间复杂度的分析多个方面的知识。目录清晰,重点标红,部分加粗,方便各位初学者和复习者注意、搜索。
一、插入排序的基本思路与实现方法
1、基本思路
插入排序的基本思路:每次取出一个待排序的数据元素,按其大小插入到之前已经排行序的数据集中,直到全部待排序插入完毕。
2、实现方法
实现方法:从左边数第二个数(索引(或下标)为1的位置)开始取数,然后与其坐标所以的数进行比较,如果取的值比左边的值小就与其交换(重复交换以达到类似插入的效果),重复取数与比较直到排序完成为止。
二、插入排序的执行过程示意图
橙色部分为上轮改变部分,箭头表示该轮要插入的数据与位置。
三、插入排序的实现代码
插入排序代码主体(以接口函数的形式)
//插入排序的实现
static void insert_sort(int arr[], int sz)
{
int i = 0;
for (i = 1; i < sz; i++)
{
int j = 0;
//从外层循环下标值比较到第一个数
for (j = i - 1; j > -1; j--)
{
if (arr[j + 1] < arr[j])//若找到较小值
{
//较小值左移
int tmp = arr[j + 1];
arr[j + 1] = arr[j];
arr[j] = tmp;
}
else
{
break;
}
}
}
}
测试部分(主函数调用)
#include <stdio.h>
int main()
{
int arr[] = { 10,7,4,9,6,1,8,3,2,5 };
int sz = sizeof(arr) / sizeof(arr[0]);
insert_sort(arr, sz);
int i = 0;
//对排序完成的数组进行输出
for (i = 0; i < sz; i++)
{
printf("%d ",arr[i]);
}
}
四、对插入排序复杂度的分析
背景知识:
时间复杂度:表示算法中基本操作(一般表示重复执行的操作)的执行次数,并不需要计算精确的执行次数,而只需要计算大概执行次数。 但我们计算时一般会尽可能先算其精确值,再通过大O的渐进表示法,取对变化趋势影响最大的部分。空间复杂度:空间复杂度是对一个算法在运行过程中临时占用存储空间大小的度量,算的是额外创建变量的个数,也使用大O的渐进表示法。
1、插入排序的时间复杂度
前置条件:设排序数据个数为N
最好情况:每个数都在恰好的位置(数据已排序好),即每个数只形式比较一次,不出现交换
只有N次,时间复杂度为O(N)。
最坏情况:数组是逆序,精确计算:
1+2+3+……+(N-2)+(N-1)
=n(n-1)/2
时间复杂度为O(N^2)
2、插入排序的空间复杂度
所使用的空间不随数据大小变化,始终为一个常数,故空间复杂度为O(1)。
总结:
总结这三期博客,发现其实冒泡排序、选择排序、插入排序三种排序方式虽然思路与实现方式都不相同,但从复杂度方面来看其实是差不多相同的,可以说都已经将数据排序算法精炼到了极致,不必比较其优劣,但对我们来说理解多种方法是必要的,它不仅能拓宽我们的思路,也对我们的逻辑思维能力有很大的提升作用。
若想要对冒泡排序与选择排序进行了解可以看看我前两期博客。
每天学习一个基础算法之冒泡排序
http://t.csdnimg.cn/VQmZs
每天学习一个基础算法之选择排序
http://t.csdnimg.cn/t4SLh
每日一学,今天你又超过了百分之九十九的人。
如果本篇文章对你有帮助,请点个关注和赞吧!
若是对本文有什么独特的见解,也可以在评论区进行讨论。