考研算法第27天:直接插入排序 【插入排序】

插入排序算法介绍

 

老规矩我们来模拟一遍样例:

其思想简单来说就是将旧数组的每个数放入到新数组中

但是每次放入都要遵守下面的原则:如果前面有比当前数大的数便把它放到当前数的后面去。

过程如下面这张图

https://ts1.cn.mm.bing.net/th/id/R-C.1d23abd4251ef903852fa4e9a9a846b0?rik=SeEmFRaYSF5Yag&riu=http%3a%2f%2fpic.rmb.bdstatic.com%2f1d23abd4251ef903852fa4e9a9a846b06357.gif&ehk=yA2Sn0CnscZZhAedxo3%2f1xOt7tBjT7UZ73Ty9mmXyl4%3d&risl=&pid=ImgRaw&r=0https://ts1.cn.mm.bing.net/th/id/R-C.1d23abd4251ef903852fa4e9a9a846b0?rik=SeEmFRaYSF5Yag&riu=http%3A%2F%2Fpic.rmb.bdstatic.com%2F1d23abd4251ef903852fa4e9a9a846b06357.gif&ehk=yA2Sn0CnscZZhAedxo3%2F1xOt7tBjT7UZ73Ty9mmXyl4%3D&risl=&pid=ImgRaw&r=0

算法题目

算法代码:

#include <iostream>

using namespace std;

const int N = 1000010;
int q[N];
void insert_sort(int n){
    //遍历每个元素
     for(int i=1;i<n;i++){
         //开始向前遍历,如果发现前面的元素比
         //x大的话,就将前面的元素放到x的后面
         int x = q[i],j=i;
         while( j && q[j-1]>x ){
             q[j] = q[j-1];
             j--;
         }
         q[j] = x;
     }
    return;
}
int main(){
    int n;
    cin>>n;
    for(int i=0;i<n;i++)scanf("%d",&q[i]);
    insert_sort(n);
    for(int i=0;i<n;i++)printf("%d ",q[i]);
    return 0;
}

算法空间和时间复杂度

空间复杂度:因为除了输入样例占得数组空间和一些变量就没有开辟其他空间所以等于O(常数+N)=O(N)。

时间复杂度:

最好:O(n=N),每次都不用换已经排序好了。

平均:O(N*N/2) = O(N^2) 

最差:两层循环: O(N^2) 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值