使用语言:C++
代码如下:
#include<iostream>
using namespace std;
int main()
{
int a[6]={31,41,59,26,41,58};
int len=sizeof(a)/sizeof(a[0]);//获取数组长度的方法
int key,i,j;
for(i=1;i<len;i++)
{
j=i;
key=a[j];
while(a[j-1]>a[j]&&j>0) //由小到大
{
a[j]=a[j-1];
a[j-1]=key;
j--;
}
}
//此处输出排序后的结果
for(int i=0;i<len;i++)
{
cout<<a[i]<<" ";
}
cout<<endl;
}
总结:插入排序,就是打牌的时候给扑克牌排序的方式。
算法分析:
1.时间复杂度分析:
这个算法中,我们可以只关注for循环中的内容。注意到for循环执行n次。
里面还有个while循环:
a.最好的情况下,就是序列已经排好,那么while中的判断条件就会一直为true,while部分执行n次。
b.最坏的情况下,就是待排序的序列完全倒置,while的执行次数就是 [1+2+3+……+(n-1)] ,等差数列求和后是n的二次式。
以最坏情况为准,插入排序的时间复杂度为O(n*n)。
2.适用情况:少量元素排序时,插入排序很有效。但当数据量增加时,注意时间复杂度是n的2次方,一次导数是2n,二次导数为2>0。所以当n增大时,导数也越来越大,插入排序的时间开销愈发难以令人接受。对于大量数据,如果n的表达式的二次导数小于0则可以考虑。