思路:
把第一个元素看作是有序的,从第二个元素起,每次都从右向左地与前面的元素比较;
如果该小于前面的某个元素,则把大的元素往右移动;
直到该元素放在了正确的位置上。 (每次循环开始时都保证前面的元素是有序的)
复杂度:(要求升序排序)
最好情况:比较n-1次
最坏情况:比较n(n-1)次,赋值操作n(n-1)+n-1 次
把第一个元素看作是有序的,从第二个元素起,每次都从右向左地与前面的元素比较;
如果该小于前面的某个元素,则把大的元素往右移动;
直到该元素放在了正确的位置上。 (每次循环开始时都保证前面的元素是有序的)
复杂度:(要求升序排序)
最好情况:比较n-1次
最坏情况:比较n(n-1)次,赋值操作n(n-1)+n-1 次
平均:O(n^2)
#include<iostream>
using namespace std;
int a[1000];
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
a[0]=0;//设置观察哨
for(int i=2;i<=n;i++)
{
int x=a[i];
for(int j=i-1;j>=0;j--)
{
if(x<a[j]) a[j+1]=a[j];
else
{
a[j+1]=x;
break;
}
}
}
for(int i=1;i<=n;i++) cout<<a[i]<<endl;
}