插入排序算法介绍
老规矩我们来模拟一遍样例:
其思想简单来说就是将旧数组的每个数放入到新数组中
但是每次放入都要遵守下面的原则:如果前面有比当前数大的数便把它放到当前数的后面去。
过程如下面这张图
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)