插入排序就是每一步都将一个待排数据按其大小插入到已经排序的数据中的适当位置,直到全部插入完毕。
每次遍历的任务是:通过扫描前面已排序的子列表,将位置i处的元素定位到从0到i的子列表之内的正确的位置上。
效率:
空间复杂度O(1)
时间复杂度O(n2)
最差情况:反序,需要移动n*(n-1)/2个元素
最好情况:正序,不需要移动元素
数组在已排序或者是“近似排序”时,插入排序效率的最好情况运行时间为O(n);
插入排序最坏情况运行时间和平均情况运行时间都为O(n2)。
以下用随机数生成表测试
#include<iostream>
using namespace std;
#include<cstdlib>
#include<ctime>
#define MAX 1000
int p[1000],n;
void insert_sort()
{
for(int i=1;i<n;i++)
{
int target=p[i];//要插入的数
int j=i;
while(j>0&&target<p[j-1])//遍历该数应该插入的位置
{
p[j]=p[j-1];//一边遍历一边移动
j--;//j为该数应该插入的位置
}
p[j]=target;
}
}
int main()
{
while(cin>>n)
{
srand(time(0));
for(int i=0;i<n;i++)
{
p[i]=rand()%MAX;
if(i==0)cout<<p[i];
else cout<<' '<<p[i];
}
cout<<endl;
insert_sort();
for(i=0;i<n;i++)cout<<p[i]<<' ';
cout<<endl;
}
}