插入排序的定义
插入排序定义互联网到处都有,就不巴巴了,记住一句话:把后面没排序的插入到前面排序的!
插入排序步骤
-
默认第一个元素为已排序元素,从第二个开始进行比较。
-
插入到前面后第一第二个元素为有序,继续比较第三个元素。
- 后面就一样操作,直到最后一个元素比较完成。
接下来就是最主要的代码了(C/C++)
C语言实现
//由于c语言中数组是直接传地址到函数中,所以在函数中修改对应数组,函数外对应也会修改
void insertSort(int arr[],int size){
//循环,从第二个元素开始和前面元素对比
for(int i=1;i<size;i++){
int point=arr[i];//设置一个基准元素
int p=i-1;//设置指针p从基准元素前一个元素开始进行移动,对比元素大小
while(p>=0&&arr[p]>point){
arr[p+1]=arr[p];//元素整体后移
p--;//移动p指针
}
arr[p+1]=point;//最后基准元素插入指针所在位置后方
}
}
C++实现
//C++中有vector可以使用,这里传入对应vector的地址,所以使用&arr,以保证函数外也改变
void insertSort(vector<int> &arr){
//循环,从第二个元素开始和前面元素对比
for(int i=1;i<arr.size();i++){
int point=arr[i];//设置一个基准元素
int p=i-1;//设置指针p从基准元素前一个元素开始进行移动,对比元素大小
while(p>=0&&arr[p]>point){
arr[p+1]=arr[p];//元素整体后移
p--;//移动p指针
}
arr[p+1]=point;//最后基准元素插入指针所在位置后方
}
}
最后总结
- 插入排序算法很好理解就是从后面的待排序内容取一个基准元素插入到前面已排序内容中对应适当的位置。
- 代码实现需要考虑到指针,即使用指针从基准元素前往前移动找到基准元素自己应该在的位置。
- 时间复杂度最坏情况下,即刚好是逆序的情况下为O(n^2),怎么计算?数列1~n-1的求和
- 时间复杂度最好情况下,即刚好是有序的情况下为O(n)。
- 空间复杂度为O(1),只为指针开辟常数级空间。