1.算法思想
输入:n个数的一个序列a1,a2...an
输出:输入序列的升序排列
2.代码
#include <iostream>using namespace std;
int main()
{
int i,j,n,key;
int a[20];
cout<<"输入数组元素个数:"<<endl;
cin>>n;
cout<<"输入数组元素:"<<endl;
for(i=0;i<n;i++)
{
cin>>a[i];
}
for(i=1;i<n;i++)
{
key=a[i];
for(j=i-1;(j>=0)&&(a[j]>key);j--)
{
a[j+1]=a[j];
}
a[j+1]=key;
}
for(i=0;i<n;i++)
{
cout<<a[i]<<" ";
}
return 0;
}
2.
输入:n个数的一个序列a1,a2...an
输出:输入序列的降序排列
#include <iostream>
using namespace std;
int main()
{
int i,j,n,key,a[20];
cout<<"输入数组大小:"<<endl;
cin>>n;
cout<<"输入数组:"<<endl;
for(i=0;i<n;i++)
{
cin>>a[i];
}
for(i=n-2;i>=0;i--)
{
key=a[i];
for(j=i+1;(j<n)&&(a[j]>key);j++)
{
a[j-1]=a[j];
}
a[j-1]=key;
}
for(i=0;i<n;i++)
{
cout<<a[i];
}
return 0;
}
3.时间复杂度
插入的次数为n,而每次插入操作需要移动的数据平均复杂度为O(n),故总的平均复杂度为:O(n*n)
最好情况:当输入的序列已经有序的时候,只需要进行比较,不用移动数据,故其复杂度仅仅为O(n)
最坏情况:当输入的序列为逆序的时候,每次插入都要移动之前所有元素,故其复杂度为O(n*n)
稳定性:如果a=b,则当a在前面时候,其必然比b先确定,而后面b再插入时,必然在a后面,故该算法稳定